【发布时间】:2020-10-18 12:54:23
【问题描述】:
这是代码。当我在VS Code 2019 和其他在线编译器中运行代码时,代码运行良好! 但是在 Codechef here 中运行它时,我遇到了一些运行时分段错误错误。
代码
#include<stdio.h>
int main(void)
{
int T;
scanf("%d", &T);
while (T >= 1 && T <= 100)
{
char a[10] ;
int x_counter = 0, y_counter = 0;
scanf("%s", &a);
char* ptr = a;
while (*ptr != '\0')
{
if (*ptr == 'x')
x_counter++;
else if (*ptr == 'y')
y_counter++;
ptr++;
}
if (x_counter < y_counter)
{
printf("%d\n", x_counter);
}
else if (y_counter <= x_counter)
{
printf("%d\n", y_counter);
}
T--;
}
return 0;
}
【问题讨论】:
-
a有足够的元素吗?此外,您通过传递具有错误类型的printf()数据来调用 未定义行为:%s应为char*,但char(*)[10]已传递。应该删除scanf()中a之前的&。 -
else if (y_counter <= x_counter)可以只是else,实际上所有if ... else ...都可以简化为printf("%d\n", (x_counter < y_counter) ? x_counter : y_counter);。使用超出有效范围的值(如 0)初始化 T(错误地以大写形式命名)或检查scanf("%d", &T)返回 1 以管理错误输入。将scanf("%s", &a);替换为scanf("%9s", a);,因为a 的大小为10,并且您还需要放置最后一个空字符,然后再次检查scanf返回1 以检测EOF 或scanf之前的错误做*a=0; -
我尝试从 scanf() 中删除 & 并将元素数量增加到 1000。但再次显示相同的错误。:(
-
那么 7000000 个元素呢?问题不是说最大输入大小吗?
-
修改后的'm'非常有用,要求
scanf自行分配正确的缓冲区大小
标签: c segmentation-fault scanf