首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么扫描不能读取我的输入?

为什么扫描不能读取我的输入?
EN

Stack Overflow用户
提问于 2016-08-22 08:59:22
回答 3查看 1.6K关注 0票数 3

我想使用scanf()阅读下表:

代码语言:javascript
代码运行次数:0
运行
复制
Q 1 3
U 2 6
Q 2 5
U 4 8

这是我的密码:

代码语言:javascript
代码运行次数:0
运行
复制
#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时,这个程序就结束了。我也不知道原因?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-22 09:04:53

之所以会出现这种情况,是因为您向程序提供了一个非数字输入,希望用%d读取一个数字。由于Q不是一个数字,所以scanf失败。

但是,您的程序没有注意scanf的返回值,而是一直在失败状态下调用它。这个程序认为它得到了一些数据,而实际上却没有。

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

调用scanf时,它将返回与其提供的%说明符对应的值。下面是如何检查scanf的返回值

代码语言:javascript
代码运行次数:0
运行
复制
if (scanf("%d", a + 3 * i + j) == 1) {
    ...                   // The input is valid
} else {
    fscanf(f, "%*[^\n]"); // Ignore to end of line
}
票数 5
EN

Stack Overflow用户

发布于 2016-08-22 09:02:41

这是因为字母q不是一个数字,所以scanf会失败,并且不动输入缓冲区。因此,下一次迭代scanf将看到相同的q,然后再次失败,等等。

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

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

代码语言:javascript
代码运行次数:0
运行
复制
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;
    }
}

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

票数 1
EN

Stack Overflow用户

发布于 2016-08-22 09:41:51

要么使用带有适当ASCII值的int变量的scanf(),要么使用带有char变量的scanf()作为字符,但在这两种情况下都使用%c。Q的ASCII码为81,U为85。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39075225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档