【问题标题】:fgets or strtok error returning unwanted third linefgets 或 strtok 错误返回不需要的第三行
【发布时间】:2016-08-18 14:24:23
【问题描述】:

我有以下代码尝试为 2 个不同的玩家获取 2 个值,但是此代码导致出现不需要的第三行,如下所示。

for(int i = 0; i < 6; i++){
    printf("Player %c>", player);
    fgets(move, 4, stdin);
    y_coord = strtok(move, sp);
    x_coord = strtok(NULL, sp);


    printf("You entered: %s, %s\n", x_coord, y_coord);
    if(player == 'O'){
        player = 'X';
    }
    else{
        player = 'O';
    }
}

输出:

Player O>5 5
You entered: 5, 5
Player X>You entered: (null),

Player O>^C

【问题讨论】:

    标签: c fgets strtok


    【解决方案1】:

    问题是您只读取了三个字符,这会将换行符留在输入缓冲区中。

    传递给fgets 的大小必须包括终止'\0' 字符,因此要让fgets 也读取换行符,您需要5 字符的缓冲区大小,即

    char move[5];  // Two characters separated by space, plus newline and terminator
    ...
    fgets(move, sizeof(move), stdin);
    

    【讨论】:

    • 可以,但现在它也可以复制到 \n 中。有什么办法可以去掉?
    • @Altern8 是的,有办法删除它。如果它存在于字符串中,它将始终是一个位置strlen(move) - 1。在那里检查它。另请记住,删除最后一个字符的好方法是将其更改为终止符'\0'
    • 检查strlen(move) - 1 设置漏洞利用 - 很少见,但move[0] 可能为 0。
    猜你喜欢
    • 1970-01-01
    • 2013-03-30
    • 2020-11-18
    • 1970-01-01
    • 2018-02-07
    • 2022-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多