Как доработать программу?
Вводится строка, нужно перевернуть второе и последнее слово, за последним словом точка.
Так же словом можно считать только кириллицу и латиницу, остальное - разделители.
Данная программа работает так:
Ввод: У?меняесть_-ANANAS
Вывод: У янем есть SANANA.
А нужно, чтобы она не убирала разделители, то есть
Вывод: У?янеместь_-SANANA.
Что сделать, чтобы программа выполнялась как нужно?
void func(char s[1000]) {
char* p = 0; // нужен нулевой указатель для strtok
char copy[100]; //задали буфер для строки результата
char* c = strtok_s(s, "1234567890!@#$%^&*()_=+/?№;:?*`~{}[]<> ,.-", &p); //функция strtok умеет делать разбор на слова
char* pred; //указатель на предыдущее слово, найденное strtok
memset(copy, '\0', 100); //буфер заполнили нулями
printf("Rezultat: ");
int i = 1;
while (c != NULL) { //пока еще есть слова
i++; //счетчик слов
pred = c; //запоминаем пред. слово
c = strtok_s(NULL, "1234567890!@#$%^&*()_=+/?№;:?*`~{}[]<> ,.-", &p); // следующее слово
if (i == 2) { //переворот 1 слова
_strrev(c);
}
if (c == NULL) { //и 2 слова
_strrev(pred);
}
strcat_s(copy, pred); //переписываем слово в буфер
strcat_s(copy, " "); //и добавляем после него пробел
}
copy[strlen(copy) - 1] = '.'; //точка в конце предложения
puts(copy);
}
void main() {
printf("Vvedite stroku: ");//ввод
char s[1000];
gets_s(s);
func(s); //вывод
}
Ответы (1 шт):
Конкретно в вашей программе, вы сами копируете слово в новый буфер, а потом добавляете пробел - поэтому и удаляются разделители.
strcat_s(copy, pred); //переписываем слово в буфер
strcat_s(copy, " "); //и добавляем после него пробел
Вообще-то здесь ничего никуда копировать не надо - можно работать прямо с оригинальной строкой.
- находите начало второго слова (указатель).
- находите конец второго слова.
- циклом делаете реверс слова.
- идете в конец строки. Аналогично находите начало и конец последнего слова.
- делаете реверс слова
Только продумайте что делать, если предложение состоит например из 1 или 2 слов.