代码在C中没有按预期工作

我正在用C编写一个程序来计算句子中的空格数。 但我还没有设法让它正常工作。 如果我输入类似Hello world 1234的内容 ,当预期输出为5时,我得到的输出是3。
我的代码是:

//Program to count number of words in a given Sentence #include  #include  int main() { char sent[100]; char sentence[] = {' ', '\0'}; printf("\nEnter a sentence :\n"); gets(sent); strcat(sentence, sent); int l = strlen(sentence), i = 0, count = 0, countCh = 0; printf("%d", l); char ch, ch1; for (i = 0; i = 'A') && (ch1 = 'a') && (ch1 <= 'z'))) count++; } } printf("\nNo of words is : %d", count); return 0; } 

我在Java中使用了相同的逻辑,它运行良好。 有人可以解释什么是错的吗?

代码中的问题在于sentence的定义。 当您省略数组维度并初始化它时,数组的大小将由初始化程序的长度决定。

引用strcat()的手册页

strcat()函数将src字符串附加到dest字符串,覆盖dest末尾的终止空字节(’\ 0’),然后添加一个终止空字节。 字符串可能不重叠, dest字符串必须有足够的空间用于结果。 如果dest不够大,程序行为是不可预测的;

也就是说,程序将调用未定义的行为 。

通过这种方式, sentence肯定会比它应该拥有的内存更少。 而且,那里根本不需要 strcat()

正确的方法是

  • 定义具有适当维度的char sentence[MAXSIZE] = {0}; ,如char sentence[MAXSIZE] = {0}; ,其中MAXSIZE将是一个具有您选择尺寸的MACRO。
  • 使用fgets()来读取用户输入。
  • 在循环中使用isspace() (来自ctype.h )来检查输入字符串中是否存在空格。

下列

  if (((ch1 >= 'A') && (ch1 <= 'Z'))||((ch1 >= 'a') && (ch1 <= 'z'))) count++; 

可能应该是

  if (ch1 != ' ') count++; 

因为现在“12345”不会算作单词。

count计算空格,因此字数是一个:因此3而不是5。

你的sentence似乎有意计算终止NUL。

如果要计算包含字母的真实单词,请使用bool状态,以确定字母中当前和先前的状态是否不同。

如上所述,您的代码可以溢出。