Напечатать все слова, отличные от последнего слова - C (СИ) (73269)
Формулировка задачи:
Дан текст. Между соседними словами – не менее одного пробела, за последним словом - точка. Напечатать все слова, отличные от последнего слова, предварительно преобразовав каждое из них по следующему правилу: перенести последнюю букву в начало слова.
Делаю в Visual Studio 2010
Программа работает, удаляет нужные слова, переносит буквы, однако помимо нужного выводит лишние символы, например как на скрине.
Можете объяснить почему?
и если можно, как исправить.
#include "locale.h" // для корректного вывода в консоль русского языка #include <stdio.h> #include <conio.h> // для доступа к команде _getch() #include <string.h> int main(void) { int i; char str1[100], str2[100],str3[100], str4[100], //переменные для оперирования строками *istr, *istr2, st[100], *loc; // переменная для корректного вывода в консоль русского языка loc = setlocale(LC_ALL,"Russian"); puts("Введите предложение: "); gets(str1); strcpy(str2,str1); istr2 = strtok (str2," "); //разбиваем строку на слова while (istr2 != NULL) { if(istr2[strlen(istr2)-1] == '.') { strcpy(str3,istr2);//запоминаем последнее слово } istr2 = strtok (NULL," ");//переходим к след слову } str3[strlen(str3)-1] = NULL;// убираем точку istr = strtok (str1," ");//разбиваем строку на слова while (istr != NULL) { strcpy(st,istr); st[strlen(st)-1] = NULL; i = (strcmp (istr,str3)); if (i != 0) if(istr[strlen(istr)-1] != '.')// если слово не совпадает с последним то оно записывается в новую строку { str4[strlen(str4)] = istr[strlen(istr)-1];//последнюю букву слова записываем в в конец строки strncat(str4, istr,strlen(istr)-1);//записываем слово без последней буквы strcat(str4," ");//добавляем пробел после слова } istr = strtok (NULL," ");//переходим к след слову } str4[strlen(str4)-1] = '.';//заканчиваем предложение точкой puts(str4); puts("Нажмите <Enter>"); _getch(); return 0; }
Решение задачи: «Напечатать все слова, отличные от последнего слова»
textual
Листинг программы
#include <locale.h> // для корректного вывода в консоль русского языка #include <stdio.h> #include <string.h> enum constants { STR_MAX = 256 }; int main(void) { char in_str[STR_MAX], cpy[STR_MAX], last_word[STR_MAX], result_str[STR_MAX], //переменные для оперирования строками *token; char tmp; size_t in_len, tok_len, res_len; // длины строк size_t tail; setlocale(LC_ALL,"Russian"); puts("Введите предложение: "); fgets(in_str, STR_MAX, stdin); in_len = strlen(in_str); if(in_len > 0 && in_str[in_len -1] == '\n') { in_str[--in_len] = '\0'; } strcpy(cpy,in_str); for(token = strtok (cpy," "); //разбиваем строку на слова token != NULL; token = strtok (NULL," ") //переходим к след слову ) { if(token[strlen(token)-1] == '.') { strcpy(last_word,token);//запоминаем последнее слово break; } } last_word[strlen(last_word)-1] = '\0';// убираем точку res_len = 0; for (result_str[0] = '\0',token = strtok (in_str," ");//разбиваем строку на слова token != NULL; token = strtok (NULL," ")//переходим к след слову ) { tok_len = strlen(token); if (0 == strcmp (token,last_word)) continue; if(token[tok_len - 1] == '.') break; // если слово не совпадает с последним то оно записывается в новую строку // меняем местами буквы if (tok_len > 1) { tmp = token[tok_len - 1]; token[tok_len - 1] = token[0]; token[0] = tmp; } tail = STR_MAX - res_len - 2; tail = (tail < tok_len) ? tail : tok_len; strncat(result_str, token, tail);//3й параметр колво свободных ячеек, а не макс длина strcat(result_str," ");//добавляем пробел после слова res_len += tail + 1; } result_str[res_len] = '.';//заканчиваем предложение точкой puts(result_str); puts("Нажмите <Enter>"); getchar(); return 0; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д