[英]why i am getting segmentation fault only when run my code in 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 != '\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;
}
您的程序將遇到未定義的行為UB因為您在 scanf "%s"
中的轉換說明符需要一個char*
但您正在傳遞 char 指針數組( char**
或char(*)[]
)。因此指針 arguments 用於scanf
必須是適合相應轉換規范返回的值的類型!! 我建議您限制scanf
stdin
並在每次迭代中刷新標准輸入緩沖區,如下所示:
int c;
scanf("%9s", a);
while ((c = fgetc(stdin)) != '\n' && c != EOF); /* Flush stdin */
因為scanf
如果在第一次成功轉換或匹配失敗發生之前到達輸入結尾,則返回EOF
。 如果發生讀取錯誤,也會返回EOF
,設置 stream 的錯誤指示器,並設置 errno 以指示錯誤。 errno
是一個 integer 變量,定義在<errno.h>
header 中,它是由系統調用和一些庫函數設置的,以指示出現錯誤的原因我們可以在下面添加層:
#include <errno.h>
#include <string.h>
....
if(scanf("%9s", a) == EOF)
{
puts(strerror(errno));
exit(EXIT_FAILURE);
}
char *strerror(int errnum);
strerror()
function 返回一個指向字符串的指針,該字符串描述了參數 errnum 中傳遞的錯誤代碼
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.