Я пытаюсь написать программу на C, которая подсчитывает количество слов и пробелов и проверяет общее слово.
Вот что у меня есть:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
int stringCount(char *str) {
int count = 0, i, spaces;
for (i = 0; *str != '\0'; i++) {
if (*str == ' ') {
spaces++;
}
}
return count;
}
bool checkWord(char *str, char *word) {
int i = 0;
int j = 0;
while (str[i] != '\0') {
if (str[i] == word[j]) {
j++;
if (word[j] == '\0') {
return true;
}
} else {
i = i - j;
j = 0;
}
i++;
}
return false;
}
int main() {
char str1[20];
char str2[20];
char word[20];
int i = 0;
int j = 0;
int k = 0;
int count = 0;
int count2 = 0;
printf("Enter a string: ");
fgets(str1, 20, stdin);
printf("Enter a string: ");
fgets(str2, 20, stdin);
count = stringCount(str1);
count2 = stringCount(str2);
printf("The number of characters in string 1 is %d\n", count);
printf("The number of characters in string 2 is %d\n", count2);
printf("The common word is: ");
if (word[k] == '\0') {
printf("%c", word[k]);
k++;
} else {
printf("There is no Common Word");
}
printf("\n");
return 0;
}
РЕДАКТИРОВАТЬ: нам запрещено использовать #include <string.h>
почему-то программа запускается
РЕДАКТИРОВАТЬ: Я застрял на stringCount()
и checkWord()
. для stringCount
нужно считать строку с пробелом, но я не знаю, как это сделать. а для checkWord()
нужно проверить, есть ли обычное слово, а не символ.
Мне жаль, что я пытаюсь отредактировать свой вопрос, чтобы опубликовать свои коды.
SO не является службой написания кода. Пожалуйста, попробуйте что-нибудь, когда вы застряли, опубликуйте код, который у вас есть, и укажите, с какой проблемой вы столкнулись.
Начнем с того, что ваша функция stringCount
имеет две переменные: spaces
и count
. Теперь, для чего они нужны? Вы используете spaces
в цикле, но вы никогда не инициализировали его нулем, поэтому вы ничего не считаете с какой-либо предсказуемостью. Более того, вы игнорируете это значение и возвращаете count
, которое всегда равно нулю.
Вы можете найти ответ на Печать самого большого слова в заданном предложении полезным... Вам нужно следить за своим Состояние, т. е. находитесь ли вы в символах чтения слова или перед, между или после пробелов для чтения слова. Также в if (word[k] == '\0')
как меняется k
? (может цикл?)
Также имейте в виду, что после fgets()
, str1
и str2
будет содержаться символ '\n'
, сгенерированный пользователем, нажав [Войти]. Вы захотите удалить его (или, по крайней мере, перестать читать символы, когда доберетесь до него). Ваши count
и count2
будут включать '\n'
в длину (может потребоваться, а может и нет - на ваше усмотрение - просто имейте в виду дополнительный символ)
@DavidC.Rankin: спокойной ночи!
Ззззз. - Косилка комментария активирована...
В вашем коде есть несколько проблем:
fgets()
, возможно, не прочитав строку. Программа будет иметь неопределенное поведение при перенаправлении из пустого файла.fgets()
сохраняет завершающую новую строку в массиве, если она есть. Вы должны удалить его перед подсчетом. Вы можете использовать функцию для чтения строки, которая не будет хранить новую строку и игнорировать дополнительные символы, введенные пользователем.stringCount()
имеет бесконечный цикл: вы не обновляете str
в цикле. Вместо этого вы должны протестировать str[i] != '\0'
.checkWord
не работает: простой подход к поиску самого длинного общего слова — это грубая сила: для каждого слова в str1
попробуйте и сравните каждое слово в str2
.Вот модифицированная версия:
#include <stdio.h>
/* read a string from the user */
int getString(const char *prompt, char *buf, int size) {
int c, i = 0;
printf("%s", prompt);
/* read a full line of characters, stop at newline or EOF */
while ((c = getchar()) != EOF && c != '\n') {
if (i + 1 < size) {
buf[i++] = (char)c;
}
}
putchar('\n');
buf[i] = '\0';
if (c == EOF && i == 0) {
return -1;
} else {
return i;
}
}
/* count the characters and spaces in the string */
int stringCount(const char *str, int *sp) {
int i, spaces = 0;
for (i = 0; str[i] != '\0'; i++) {
if (str[i] == ' ')
spaces++;
}
if (sp != NULL)
*sp = spaces;
return i;
}
int findCommonWord(const char *str1, const char *str2, char *buf) {
int i, j, k, n1, n2;
int best_i = 0, best_len = 0;
for (i = 0; str1[i] != '\0'; i += n1) {
n1 = 1;
if (str1[i] == ' ')
continue;
/* compute length of word starting at str1[i] */
while (str1[i + n1] != '\0' && str1[i + n1] != ' ') {
n1++;
}
/* if the word is longer than the best match, try and find it in str2 */
if (n1 > best_len) {
for (j = 0; str2[j] != '\0'; j += n2) {
n2 = 1;
if (str2[j] == ' ')
continue;
/* compute length of word starting at str2[j] */
while (str2[j + n2] != '\0' && str2[j + n2] != ' ') {
n2++;
}
if (n1 == n2) {
for (k = 0; k < n1; k++) {
if (str1[i + k] != str2[j + k])
break;
}
/* if comparison succeeds we have a new best match */
if (k == n1) {
best_len = n1;
best_i = i;
}
}
}
}
}
/* copy the longest match */
for (k = 0; k < best_len; k++) {
buf[k] = str1[best_i + k];
}
buf[k] = '\0';
return k;
}
int main() {
char str1[100], str2[100], word[100];
int count1, spaces1, count2, spaces2;
if (getString("Enter a string: ", str1, sizeof str1) < 0
|| getString("Enter a string: ", str2, sizeof str2) < 0)
return 1;
count1 = stringCount(str1, &spaces1);
count2 = stringCount(str2, &spaces2);
printf("string 1: %d characters, %d spaces\n", count1, spaces1);
printf("string 2: %d characters, %d spaces\n", count2, spaces2);
if (findCommonWord(str1, str2, word)) {
printf("The longest common word is: %s\n", word);
} else {
printf("There is no common word\n");
}
return 0;
}
Выход:
Enter a string: Hello world I am Benny
Enter a string: I am the world
string 1: 22 characters, 4 spaces
string 2: 14 characters, 3 spaces
The longest common word is: world
Вы должны на самом деле задать вопрос, на который можно ответить. Если у вас нет конкретного вопроса о том, что вы пытаетесь сделать, возможно, этот форум не для вас.