Напечатать все слова, отличные от последнего слова - 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;
}