Напечатать все слова, отличные от последнего слова - C (СИ) (73269)

Узнай цену своей работы

Формулировка задачи:

Дан текст. Между соседними словами – не менее одного пробела, за последним словом - точка. Напечатать все слова, отличные от последнего слова, предварительно преобразовав каждое из них по следующему правилу: перенести последнюю букву в начало слова.
Листинг программы
  1. #include "locale.h" // для корректного вывода в консоль русского языка
  2. #include <stdio.h>
  3. #include <conio.h> // для доступа к команде _getch()
  4. #include <string.h>
  5. int main(void)
  6. {
  7. int i;
  8. char str1[100], str2[100],str3[100], str4[100], //переменные для оперирования строками
  9. *istr, *istr2,
  10. st[100],
  11. *loc; // переменная для корректного вывода в консоль русского языка
  12. loc = setlocale(LC_ALL,"Russian");
  13. puts("Введите предложение: ");
  14. gets(str1);
  15. strcpy(str2,str1);
  16. istr2 = strtok (str2," "); //разбиваем строку на слова
  17. while (istr2 != NULL)
  18. {
  19. if(istr2[strlen(istr2)-1] == '.')
  20. {
  21. strcpy(str3,istr2);//запоминаем последнее слово
  22. }
  23. istr2 = strtok (NULL," ");//переходим к след слову
  24. }
  25. str3[strlen(str3)-1] = NULL;// убираем точку
  26. istr = strtok (str1," ");//разбиваем строку на слова
  27. while (istr != NULL)
  28. {
  29. strcpy(st,istr);
  30. st[strlen(st)-1] = NULL;
  31. i = (strcmp (istr,str3));
  32. if (i != 0)
  33. if(istr[strlen(istr)-1] != '.')// если слово не совпадает с последним то оно записывается в новую строку
  34. {
  35. str4[strlen(str4)] = istr[strlen(istr)-1];//последнюю букву слова записываем в в конец строки
  36. strncat(str4, istr,strlen(istr)-1);//записываем слово без последней буквы
  37. strcat(str4," ");//добавляем пробел после слова
  38. }
  39. istr = strtok (NULL," ");//переходим к след слову
  40. }
  41. str4[strlen(str4)-1] = '.';//заканчиваем предложение точкой
  42. puts(str4);
  43. puts("Нажмите <Enter>");
  44. _getch();
  45. return 0;
  46. }
Делаю в Visual Studio 2010 Программа работает, удаляет нужные слова, переносит буквы, однако помимо нужного выводит лишние символы, например как на скрине. Можете объяснить почему? и если можно, как исправить.

Решение задачи: «Напечатать все слова, отличные от последнего слова»

textual
Листинг программы
  1. #include <locale.h>         //  для корректного вывода в консоль русского языка
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. enum constants {
  6.     STR_MAX = 256
  7. };
  8.  
  9. int main(void)
  10. {
  11.     char in_str[STR_MAX], cpy[STR_MAX],
  12.          last_word[STR_MAX], result_str[STR_MAX],   //переменные для оперирования строками
  13.         *token;
  14.     char tmp;
  15.     size_t in_len, tok_len, res_len; // длины строк
  16.     size_t tail;
  17.  
  18.     setlocale(LC_ALL,"Russian");
  19.     puts("Введите предложение: ");
  20.     fgets(in_str, STR_MAX, stdin);
  21.     in_len = strlen(in_str);
  22.     if(in_len > 0 && in_str[in_len -1] == '\n') {
  23.         in_str[--in_len] = '\0';
  24.     }
  25.     strcpy(cpy,in_str);
  26.     for(token = strtok (cpy," ");  //разбиваем строку на слова
  27.         token != NULL;
  28.         token = strtok (NULL," ")   //переходим к след слову
  29.         )
  30.     {
  31.         if(token[strlen(token)-1] == '.')
  32.         {
  33.             strcpy(last_word,token);//запоминаем последнее слово
  34.             break;
  35.         }
  36.     }
  37.     last_word[strlen(last_word)-1] = '\0';// убираем точку
  38.  
  39.     res_len = 0;
  40.     for (result_str[0] = '\0',token = strtok (in_str," ");//разбиваем строку на слова
  41.          token != NULL;
  42.          token = strtok (NULL," ")//переходим к след слову
  43.          )
  44.     {
  45.         tok_len = strlen(token);
  46.         if (0 == strcmp (token,last_word)) continue;
  47.         if(token[tok_len - 1] == '.') break;
  48.         // если слово не совпадает с последним то оно записывается в новую строку
  49.         // меняем местами буквы
  50.         if (tok_len > 1) {
  51.             tmp = token[tok_len - 1];
  52.             token[tok_len - 1] = token[0];
  53.             token[0] = tmp;
  54.         }
  55.         tail = STR_MAX - res_len - 2;
  56.         tail = (tail < tok_len) ? tail : tok_len;
  57.         strncat(result_str, token, tail);//3й параметр колво свободных ячеек, а не макс длина
  58.         strcat(result_str," ");//добавляем пробел после слова
  59.         res_len += tail + 1;
  60.     }
  61.  
  62.     result_str[res_len] = '.';//заканчиваем предложение точкой
  63.     puts(result_str);
  64.     puts("Нажмите <Enter>");
  65.     getchar();
  66.     return 0;
  67. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.286 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы