Напечатать все слова, отличные от последнего слова - 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;
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д