У меня есть программа подсчета слов на языке C, которая исключает специальные символы и цифры:
int main(){
char str[100];
int i, j = 0;
int len;
char choice;
do {
printf("Enter String: ");
fgets(str, sizeof(str), stdin);
len = strlen(str);
for (i = 0; i < len; i++) {
if ((str[i] >= 'A' && str[i] <= 'Z') ||
(str[i] >= 'a' && str[i] <= 'z')) //checks if its upper or lowercase {
if (str[i] != ' ' && (str[i + 1] == ' ' || str[i + 1] == '\0'))//checks if the current character is a space and also the end of the string{
j++;
}
}
}
printf("Word count: %d\n", j);
printf ("Try again?(Y/N): ");
scanf (" %c", &choice);
getchar ();//use to clear input buffer
} while (choice == 'y' || choice == 'Y');
return 0;
}
Но он не учитывает первую строку после пробела и, кажется, становится немного запутанным, когда я продолжаю цикл.
Я пробовал менять значения массива, цикла, а также пытался спросить ИИ, что я пропустил, но предложения не сработали.
выход:
Enter String: i
Word count: 0
Try again? (Y/N): Y
Enter String: i have 3 Apples
Word count: 2
Try again? (Y/N): Y
Enter String: hello WORLD
Word count: 3
Try again? (Y/N): hello world
str[i] != ' ' всегда верно, туда не попасть, если иероглиф не буква. Я бы предложил просмотреть код в отладчике, чтобы увидеть, где что-то идет не так.
Добро пожаловать в Stack Overflow! Пожалуйста, публикуйте код, данные и результаты в виде текста, а не скриншотов (как форматировать код в сообщениях ). Почему мне не следует загружать изображения кода/данных/ошибок? idownvotedbecau.se/imageofcode
@Roshina De Иисуса Вы не сбрасываете переменную j в цикле do- while.
«первая строка после пробела не учитывается». Работайте с конечным автоматом — вы либо анализируете слово, либо анализируете пробел. Начните с состояния «пробел» и отсчитывайте в начале каждого слова, то есть когда состояние меняется с «пробела» на «слово».
У вас также есть isalpha(), isspace() и т. д., которые можно использовать. Кроме того: переименуйте переменную j в wordcount.
//...{ в нескольких местах делает { частью комментария; он не влияет на поток управления (и, конечно, не будет компилироваться).





Для начала функция fgets может добавить символ новой строки '\n' к введенной строке.
Вы должны либо удалить его, например, как
str[strcspn( str, "\n" )] = '\0';
или учтите в своих утверждениях if.
В противном случае в результате вы получите, например,
Enter String: i
Word count: 0
хотя по вашему описанию количество слов должно быть равно 1.
Во-вторых, вы не обнуляете переменную j внутри цикла do- while.
Это выражение
str[i] != ' '
во внутреннем операторе if всегда оценивается как логическая истина. Поэтому его присутствие в операторе if является излишним.
Также будет гораздо лучше использовать стандартную функцию isalpha вместо сравнения символов с символами. Также символ табуляции '\t', а также некоторые символы, не являющиеся буквами, могут разделять слова, как написано в вашем описании задачи, но вы это проигнорировали. Согласно вашему подходу, эта строка "one,two,three" содержит одно слово.
«гораздо лучше использовать стандартную функцию isalpa» --> да, но тогда isalpha() нужно получить значения unsigned char, а не char, которые могут быть отрицательными.
Несколько несвязанных комментариев: Смешивать
fgets,scanfиgetchar— плохая идея. Также используйте стандартные функцииisalpha()иisspace()вместо проверок.