繁体   English   中英

为什么scanf无法读取我的输入?

[英]Why scanf cannot read my input?

我想使用scanf()来读取下表:

Q 1 3
U 2 6
Q 2 5
U 4 8

这是我的代码:

#include <stdio.h>
#include <stdlib.h>

void main() {
    int *a;
    int i, j;

    a = (int *) malloc(4 * 3 *sizeof(int));

    printf("input:\n");
    for (i = 0; i < 4; i++) {
        for (j = 0; j < 3; j++) {
           scanf("%d", a + 3 * i + j);
        }
    }

    printf("output:\n");

    for (i = 0; i < 4; i++) {
        for (j = 0; j < 3; j++) {
           printf("%d  ", a[3*i+j]);
        }
        printf("\n");
    }   
}

在此输入图像描述

但是,当我输入第一行Q 1 3 ,该程序结束。 我不知道为什么?

发生这种情况是因为您为程序提供了一个非数字输入,希望读取%d的数字。 由于Q 不是数字,因此scanf失败。

但是,您的程序没有注意scanf的返回值,并一直将其调用为失败状态。 该程序认为它正在获取一些数据,而实际上并没有。

要解决此问题,请在读取非数字字符时更改代码以传递%c%s ,检查scanf的返回值,并在scanf失败时删除无效输入。

当您调用scanf ,它将返回与其提供的%说明符对应的值的数量。 以下是检查scanf的返回值的方法:

if (scanf("%d", a + 3 * i + j) == 1) {
    ...                   // The input is valid
} else {
    fscanf(f, "%*[^\n]"); // Ignore to end of line
}

这是因为字母Q不是数字,因此scanf将失败并保持输入缓冲区不变。 因此,下一次迭代scanf将看到相同的Q并再次失败,依此类推......

这意味着实际上没有任何东西被读入您分配的内存中,并且您打印出未初始化的内存,从而导致未定义的行为

解决问题的一种可能方法可能是读取 (使用例如fgets ),然后使用sscanf一次性解析整行。 也许是这样的

for (i = 0; i < 4; i++) {
    char buffer[64];
    if (fgets(buffer, sizeof buffer, stdin) != NULL) {
        char c;  // The character
        int a, b;  // The integer values
        sscanf(buffer, "%c %d %d", &c, &a, &b);
        a[3 * i + 0] = c;
        a[3 * i + 1] = a;
        a[3 * i + 2] = b;
    }
}

我还建议你实际初始化你分配的内存,特别是如果你不打算使用它的一部分但仍然打印出来。

要么使用scanf()与int变量适当ASCII值或使用scanf()与字符char变量但在这两种情况下%C打印。 Q的 ASCII码为81, U为85。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM