你能用这个字计算代码帮我一把吗?

时间:2015-10-19 15:03:09

标签: c

此代码不能正确计算单词。我不知道这是不是错了。需要帮忙。

#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");
}

4 个答案:

答案 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个字符尚未初始化,这会导致未定义的行为。

此外,从099的循环会出现相同的问题,因为您可能会输入少于100个字符的字符串,在这种情况下,您也会访问未初始化的数据。

您可以通过更改此

来修复您的计划
scanf("%s", &s[50]);

scanf("%99s", s);

然后

for (i = 0 ; i < 100 ; i++) {

for (i = 0 ; s[i] != '\0' ; i++) {

因为scanf()会附加一个'\0'来使数组成为有效的 ,这也是"%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;
}