1

我正在对旅行骑士问题进行非常简单的 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 
}
4

1 回答 1

2

四件事。

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

也就是说,

#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;
}
于 2013-10-09T01:02:19.953 回答