情况如下:
首先,输入包含第一行中的测试用例数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);
可以解决问题,我不知道为什么。但是当我添加它时,问题就解决了,但它在在线判断系统中的测试失败了。
我的错误是什么?
答案 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++;
}