簡體   English   中英

為什么只有在 codechef 中運行我的代碼時才會出現分段錯誤?

[英]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 中傳遞的錯誤代碼

有關strerrorerrno的更多詳細信息。 go 到以下鏈接: errno strerror

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM