此代码不能正确计算单词。我不知道这是不是错了。需要帮忙。
#include <stdio.h>
#include <stdlib.h>
int count_p(char sentence[100]) {
int i, m = 1;
for (i = 0 ; i < 100 ; i++) {
if (sentence[i] == ' ') {
m += 1;
}
}
return(m);
}
void main() {
char s[100];
int p;
printf("Sentence here: ");
scanf("%s", &s[50]);
p = count_p(sentence);
printf("Words: %d", p);
printf("\n");
}
答案 0 :(得分:2)
%s
中的scanf
在找到空格时停止读取。因此,' '
不会出现s
,除非它在未初始化的变量中作为不确定值存在。
您可以使用fgets
阅读整行。
这是一个固定代码,也会检查字符串的结尾。
#include <stdio.h>
#include <stdlib.h>
int count_p(char sentence[100]) {
int i, m = 1;
for (i = 0 ; i < 100 && sentence[i] != '\0'; i++) {
if (sentence[i] == ' ') {
m += 1;
}
}
return(m);
}
int main(void) {
char s[100];
int p;
printf("Sentence here: ");
fgets(s, sizeof(s), stdin);
p = count_p(s);
printf("Words: %d", p);
printf("\n");
return 0;
}
答案 1 :(得分:0)
您看到&s[50]
表示您将指针传递给s
的第51个元素,然后您尝试从头开始访问s
但,s
中的前50个字符尚未初始化,这会导致未定义的行为。
此外,从0
到99
的循环会出现相同的问题,因为您可能会输入少于100个字符的字符串,在这种情况下,您也会访问未初始化的数据。
您可以通过更改此
来修复您的计划scanf("%s", &s[50]);
到
scanf("%99s", s);
然后
for (i = 0 ; i < 100 ; i++) {
到
for (i = 0 ; s[i] != '\0' ; i++) {
因为scanf()
会附加一个'\0'
来使数组成为有效的c string,这也是"%99s"
的原因。
另一个问题是,如果你想让空白字符不让scanf()
停止阅读,你需要一个不同的说明符,因为"%s"
在第一个空格字符处停止,这是一个建议< / p>
scanf("%99[^\n]", s);
或者您可以按建议@ MikeCAT进行操作,然后选择fgets()
。但在'\n'
的情况下,请注意尾随fgets()
。
最后,在这种情况下极不可能,scanf()
可能会失败。为了表示成功,它返回实际匹配的说明符数,因此它也可能表示部分成功。看到scanf()
的返回值被忽略是相当常见的,例如,当你有一个"%d"
说明符时,它非常糟糕,因为在初始化之前可能会访问correspoinding参数它
答案 2 :(得分:0)
scanf("%s", &s[50]);
在输入和写入超出范围的索引时,这不是一种正确的方法。这样做 -
scanf("%99[^\n]", s); // this will read 99 characters and until '\n' is encountered
在main
中,您的函数调用不正确 -
p = count_p(sentence); // sentence is not declares in main
这样打电话 -
p = count_p(s); // pass s instead of sentence to function
同样在函数count_p
中,将for
循环中的ccondition更改为 -
size_t i;
size_t len=strlen(s);
for (i = 0 ; i < len ; i++)
答案 3 :(得分:0)
语句scanf("%s", &s[50]);
在你的情况下是正确的。因为你想输入一个用空格分隔的句子,正确的做法是:
scanf(" %99[^\n]s",sentence);
这将防止缓冲区溢出并允许单词之间的空格。如果sentence
具有连续的空格,您的程序似乎也无法正确计算单词。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int count_p(char *sentence);
void main()
{
char sentence[100];
printf("Sentence here: ");
scanf(" %99[^\n]s",sentence);
int p = count_p(sentence);
printf("Words: %d", p);
printf("\n");
}
int count_p(char *sentence)
{
int len = strlen(sentence);
int x = 0 , wordCount = 0;
for( int n = 0 ; n < len ; n++ )
{
x++;
if( sentence[n] == ' ' )
x = 0;
if( x == 1 )
wordCount++;
}
return wordCount;
}