Напишите программу, которая переворачивает все слова в строке - C (СИ)
Формулировка задачи:
Добрый день.
Проблема в том, что программа проходит успешно только 8 из 14 тестов - в остальных пишет "ошибка выполнения". Мне посоветовали сделать массив глобальным. Но я только начала учить Си, так что понятия не имею что это. Объясните, пожалуйста, что и где нужно дописать, чтобы сделать массив глобальным и что это вообще значит. Большое спасибо.
Текст задания:
Напишите программу, которая переворачивает все слова в строке. Символы, отличные от латинских букв должны остаться на месте.
Вводится одна строка, завершающаяся символом конца строки '\n'. Длина строки менее 1000.
Моя программа:
#include<stdio.h>
#include<string.h>
//#include<conio.h>
int main()
{char p[1100],*h;
int i,g,n,u,c,k,v;
u=0;i=0;n=0;c=0;k=0;
gets(p);
u=strlen(p);
while(i<u)
{if(p[i]==' ' || p[i] < 65 || (p[i] > 90 && p[i]< 97) || p[i]> 122 )
{k=n;
while(k<=(n+((i-n)/2))-1)
{c=p[k];p[k]=p[i-1+n-k];
p[i-1+n-k]=c;k=k+1;
}
n=i+1;i++;
}
else
i=i+1;
}k=n;
while(k<=(n+(u-n)/2)-1)
{c=p[k];p[k]=p[u-1+n-k];
p[u-1+n-k]=c;k++;
}
for(h=p;*h<=u;h++)
printf("",&h);
puts(p);
//getch();
return 0;
}
Сейчас попробовала объявить массив как unsigned char - программа прошла на 2 теста больше, чем в прошлый раз, но в остальных по-прежнему ошибка выполнения.
Решение задачи: «Напишите программу, которая переворачивает все слова в строке»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char p[1100], *h;
int i = 0, n = 0, u = 0, c = 0, k = 0;
gets(p);
u = strlen(p);
while (i < u)
{
if (p[i] == ' ' || p[i] < 65 || (p[i] > 90 && p[i] < 97) || p[i] > 122)
{
k = n;
while (k <= (n + ((i - n) / 2)) - 1)
{
c = p[k];
p[k] = p[i - 1 + n - k];
p[i - 1 + n - k] = c;
k++;
}
n = i + 1;
}
i++;
}
k = n;
while (k <= (n + (u - n) / 2) - 1)
{
c = p[k];
p[k] = p[u - 1 + n - k];
p[u - 1 + n - k] = c;
k++;
}
for (h = p; *h; h++)
{
printf("%c", *h);
}
printf("\n");
system("pause");
return 0;
}
Объяснение кода листинга программы
- Ввод строки с помощью функции gets(p).
- Определение длины строки с помощью функции strlen(p) и сохранение ее в переменную u.
- Перебор всех символов строки с помощью цикла while (i < u).
- Проверка условия для каждого симвома:
- Если символ является пробелом, переворачивание слов не требуется.
- Если символ является буквой верхнего регистра, переворачивание слов не требуется.
- Если символ является буквой нижнего регистра, переворачивание слов не требуется.
- Если символ является любым другим символом, происходит переворачивание слов.
- Переворачивание слов происходит с помощью двух вложенных циклов while:
- Внешний цикл для перебора символов от начала строки до текущего символа (n).
- Внутренний цикл для перебора символов от k до (n + ((i - n) / 2)) - 1, где k - это индекс первого символа слова, которое нужно перевернуть.
- Перестановка символов в слове с помощью временной переменной c.
- Обновление индексов для следующего символа внешнего цикла.
- После завершения внешнего цикла, переворачивание слов происходит с помощью двух вложенных циклов while:
- Внешний цикл для перебора символов от начала строки до половины длины строки (n + (u - n) / 2) - 1.
- Внутренний цикл для перестановки символов в словах, которые были перевернуты в предыдущем цикле.
- Вывод перевернутой строки с помощью цикла for и функции printf.
- Ожидание нажатия клавиши с помощью функции system(
pause). - Возврат 0, что означает успешное выполнение программы.