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

标签 c scanf

我想使用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");
    }   
}

enter image description here

但是,当我输入第一行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
}

关于c - 为什么 scanf 无法读取我的输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39075225/

相关文章:

C语言: Scanning and printing Names

c - fscanf 在此 C 代码中失败

c - 从文件中搜索和打印字符串时,打印的是每一行,而不是我需要的那一行

char - scanf 并将 char 保留为整数

c - C中将数组和数组指针传递给函数的区别

C 内核字符串连接和比较

c - c语言Openflow数据包解析

c - 如何在 Netbeans IDE 中用 C 编程语言触发 EOF(文件结束符)

c++ - Solaris 10 -- 从 recvmsg() 的 UDP 多播数据包中获取 IP 源地址

c - 为什么 scanf 需要两个数字?