找到字符串中的数字位数时出错

时间:2016-01-29 15:53:24

标签: c string algorithm fseek

情况如下:

首先,输入包含第一行中的测试用例数m,然后是m测试用例。每个测试用例由一个少于256个字符的字符串组成。字符串可能包含"空格键"。我的编程语言是C.

然后,这是我的问题。我在代码中找不到任何问题,我可以完美地运行具有正确结果的示例。但是,当我将其上传到在线判断系统时,它会显示" WA(错误答案)"。

这是我的代码。

#include<stdio.h>

int numberOfDigit(char input[255])
{
    int num = 0;

    for (int i = 0; input[i] != '\0'; i++) {
        if (input[i] >= 48 && input[i] <= 57)
            num++;
    }

    return num;
}

int main()
{
    int numberOfTestCase;
    char input[255];
    int digit[9999];

    scanf("%d", &numberOfTestCase);

    for (int j = 0; j < numberOfTestCase; j++) {
        fseek(stdin, 0, SEEK_END);
        gets(input);
        digit[j] = numberOfDigit(input);
    }

    for (int k = 0; k < numberOfTestCase; k++) {
        printf("%d\n", digit[k]);
    }

    return 0;
} 

我想在我的编码过程中解释一些事情。

因为输入包含空格字符,所以我使用gets()函数,这样我就可以通过输入空格来获取字符串而不会停止。 但是,如果我没有添加fseek(stdin, 0, SEEK_END);gets()只显示numberOfTestCase-1次,我就会在stackOverflow上询问,并被告知fseek(stdin, 0, SEEK_END);可以解决问题,我不知道为什么。但是当我添加它时,问题就解决了,但它在在线判断系统中的测试失败了。

我的错误是什么?

1 个答案:

答案 0 :(得分:2)

fgets()如果看到换行符,就会停止阅读输入。此外,fseek()可能无法在stdin上运行,并且它对您的目的来说是不必要的。相反,您也可以fgets()来读取第一行而不是scanf()。然后您可以使用sscanf()来读取输入数字。

类似的东西:

fgets(input, sizeof input, stdin);
sscanf(input, "%d", &numberOfTestCase);

for (int j = 0; j < numberOfTestCase; j++) {
    fgets(input, sizeof input, stdin);
    digit[j] = numberOfDigit(input);
}

for (int k = 0; k < numberOfTestCase; k++) {
    printf("%d\n", digit[k]);
}

您还可以使用chracter常量而不是硬编码ASCII值,这样更易​​读和可移植:

for (int i = 0; input[i] != '\0'; i++) {
    if (input[i] >= '0' && input[i] <= '9')
        num++;
}