当使用第二个scanf(“%s”)时,第一个scanf(“%s”)中断,读取0

时间:2013-10-09 00:47:07

标签: c string char scanf

我正在为旅行骑士问题做一个非常简单的BFS搜索。不幸的是,我的输入决定出错。这段代码给出了正确的结果。

char start[2], destination[2];
scanf("%s", start);                    // input string is "e2"
printf("%d %d\n", start[0], start[1]); // start[0] = 101, start[1] = 50 
                                          (in ASCII, 101 is 'e' and 50 is '2')    

我使用的那个

scanf("%s", start);                    // input string is "e2"
scanf("%s", destination);              // input string is "e4"
printf("%d %d\n", start[0], start[1]); // start[0] = 0, start[1] = 50

scanf("%s %s", start, destination);    // input string is "e2 e4"
printf("%d %d\n", start[0], start[1]); // start[0] = 0, start[1] = 50

目标数组不会遇到这种错误。我做错什么了吗?如果这是一个错误,有没有我可以使用的替代方案?

编辑:开始声明为char [2],同样与目的地相同。 SSCCE

void main()
{
    char start[2], destination[2];
    scanf("%s", start);                    // input string is "e2"
    scanf("%s", destination);              // input string is "e4"
    printf("%d %d\n", start[0], start[1]); // start[0] = 101, start[1] = 50 
}

1 个答案:

答案 0 :(得分:2)

四件事。

  1. void main()不标准。它应该返回int
  2. 你的char缓冲区不够大。
  3. scanf()到数组的任何字符串的长度限制为比数组大小少一个。那会对你暗示你的缓冲区太小了。 "%1s"嗯....
  4. 在依赖它们之前验证您的scanf()结果。
  5. 那就是说,

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int res = EXIT_FAILURE;
    
        char start[3], destination[3];
        if (scanf("%2s", start) == 1 && 
            scanf("%2s", destination) == 1)
        {
            printf("%d %d\n", start[0], start[1]);
            res = EXIT_SUCCESS;
        }
        return res;
    }