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

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

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

Дан текст. Между соседними словами – не менее одного пробела, за последним словом - точка. Напечатать все слова, отличные от последнего слова, предварительно преобразовав каждое из них по следующему правилу: перенести последнюю букву в начало слова.
#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;
}
Делаю в Visual Studio 2010 Программа работает, удаляет нужные слова, переносит буквы, однако помимо нужного выводит лишние символы, например как на скрине. Можете объяснить почему? и если можно, как исправить.

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

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;
}

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


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

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

7   голосов , оценка 4.286 из 5
Похожие ответы