C - 为什么我只在 CodeChef 中运行我的代码时才出现分段错误?



这是代码。当我在VS Code 2019和其他在线编译器中运行时,代码也可以正常工作!但是当在这里的Codechef中运行时,我遇到了一些运行时分段错误。

代码

#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 != '')
{
if (*ptr == 'x')
x_counter++;
else if (*ptr == 'y')
y_counter++;
ptr++;
}
if (x_counter < y_counter)
{
printf("%dn", x_counter);
}
else if (y_counter <= x_counter)
{
printf("%dn", y_counter);
}
T--;
}
return 0;
}

您的程序将遇到未定义的行为 UB 表示您在 scanf 中的转换说明符"%s"它期望一个char*,但您正在传递字符指针数组(char**char(*)[](.因此scanf的指针参数必须是适合相应转换规范返回的值的类型!!我建议您限制scanf函数并在每次迭代中刷新stdin缓冲区,如下所示:

int c;
scanf("%9s", a);
while ((c = fgetc(stdin)) != 'n' && c != EOF); /* Flush stdin */

因为scanf返回EOF如果在第一次成功转换或发生匹配失败之前到达输入终点。 如果发生读取错误,设置流的错误指示器,并将 errno 设置为指示错误,也会返回EOFerrno是一个在标头中找不到的整数变量<errno.h>它由系统调用和一些库函数设置,以防发生错误以指示出了什么问题我们可以在下面添加一层:

#include <errno.h>
#include <string.h>
....
if(scanf("%9s", a) == EOF)
{
puts(strerror(errno));
exit(EXIT_FAILURE);
}
char *strerror(int errnum);

strerror()函数返回指向描述 参数 errnum 中传递的错误代码

有关strerrorerrno的更多详细信息,请访问以下链接: 埃尔诺 斯特错

相关内容

  • 没有找到相关文章