空间如何与scanf一起工作?

时间:2012-01-21 22:01:34

标签: c arrays scanf space

我是一名数学学生,我正在学习C语言编程的基础知识。我需要一个程序来读取数组中的输入,其中的组件必须具有某些必要条件;我希望程序向用户询问数组的组件。然后,用户必须输入用空格分隔它们的组件。细节对于解决主要问题并不重要;我将选择一个更简单的例子然后我正在处理的那个:假设我想要一个包含6个组件的数组,不要包含数字4.所以我试过了:

#include <stdio.h>

int main(void) {
    int a[6];
    printf("enter components: ");
    int i;
    for (i = 0; i < 6; i++) {
        scanf("%d", &a[i]);
        if (a[i] == 4) printf(" \n\n4 is not allowed, try again\n\n");
    }
    for (i = 0; i < 6; i++) {
        printf("%d ", a[i]);
    }
}

如果我编译并运行它,例如输入:

1 2 3 4 5 6

我会得到我的错误信息,但只有在按下回车后,即在输入所有六个组件之后(在第四次按空格后不直接)。所以这是我的问题(我正在寻找不使用字符串或指针的解决方案,除非没有它们是不可能的):

  1. 有没有办法让程序在输入后续空格后直接读取组件(并采取相应的行动)?我猜不会因为scanf只能在用户按下回车后工作,而不是空格,对吗?

  2. 如果没有,是否有办法让程序在最后按Enter键后立即读取所有组件,但让用户从最后一个组件中取出?例如,通过上面的输入,我希望程序显示如下内容:

    4 is not allowed
    1 2 3 _
    

    以便用户可以更正他/她的输入(也可能更改前三位数字)。

  3. 很抱歉,如果这个问题太愚蠢了!谢谢你的帮助!!


    编辑:嗯,谢谢你的答案,你们都非常乐于助人!遗憾的是,我不能接受不止一个。

5 个答案:

答案 0 :(得分:2)

在for循环中,每次迭代后,计数器自动加1。如果输入无效,则应防止计数器增加。为此,只需在输入无效时将i--;添加到代码中。

#include <stdio.h>

int main(void) {
    int a[6];
    printf("enter components: ");
    int i;
    for (i = 0; i < 6; i++) {
        scanf("%d", &a[i]);
        if (a[i] == 4){
           printf(" \n\n4 is not allowed, try again\n\n");
           i--;
        }
    }
    for (i = 0; i < 6; i++) {
        printf("%d ", a[i]);
    }
}

答案 1 :(得分:1)

这与您的终端处于“熟”模式有关。在用户按下回车键之前,字符甚至不会发送到程序。

答案 2 :(得分:1)

改善Mir Milad Hosseiny的答案(我错误地认为它是一个失控的无限循环......它实际上是我在评论中描述的无限循环)......

我会写一个小函数,它有一个“白名单”(你想要的东西)或你不想要的“黑名单”,并检查每个值是否属于(取决于方法)到列表。通过这种方式,您可以在一个单独的位置保存您愿意接受的值或您不愿意接受的值,因此您的主要功能不会因“if”中的异常或包含而变得非常混乱

所以你的代码将是

if(isAllowed(a[i]){
   myList[j] = a[i]; //j is your alternate counter
}

答案 3 :(得分:1)

你可以这样做:

int i,a[6];
for (int i=0;i<6;i++) {
 scan: scanf("%d",&a[i]);
}
for (int i=0;i<6;i++) if (a[i]==4) {
 printf("4 is not allowed. re-enter the last %d numbers\n",6-i);
 goto scan;
}

请注意,在大多数情况下,最好避免使用goto,但在这种情况下,我认为这很自然。

如果你真的想要,可以打印第一个i数字(在goto之前),但是让用户更改这些数字很复杂(并且依赖于平台)。

答案 4 :(得分:1)

请参阅以下代码:

#include <stdio.h>

int main(void) {
    int a[6];
    int i;
    bool hasError = false;
    int errorIndex = 0;
    do{
        hasError = false;
        printf("enter components: ");
        for (i = 0; i < errorIndex; i++)
            printf("%d ", a[i]);

        for (i = errorIndex; i < 6; i++) {
            scanf("%d", &a[i]);
            if (a[i] == 4 && hasError == false){
                printf(" \n\n4 is not allowed, try again\n\n");
                hasError = true;
                errorIndex = i;
            }
        }
    }while(hasError == true);
    for (i = 0; i < 6; i++) {
        printf("%d ", a[i]);
    }
}