getchar()和scanf中的输入缓冲区

时间:2015-03-20 14:01:18

标签: c input io scanf getchar

很抱歉,因为我想不出任何更好的头衔 处理输入时遇到问题 这是我的测试代码,它将输入转换为字符串数组,然后再次在屏幕上打印,非常简单

第一个测试代码正常工作

#include <stdio.h>
int main()
{
    int i, index;
    char d, c[20];
    scanf("%d", index);
    for(i=0; i<index; i++){
        *(c+i) = getchar();
        if (*(c+i)=='$')
            break;
    }
    printf("the string is %s", c);
    return 0;
}

第二个测试代码,我确实使用了指针而不是c [i]而且程序没有运行。这很奇怪,因为*(c + i)和c [i]是等价的

我改变了

        *(c+i) = getchar(); // (0)
        if (*(c+i)=='$')

        c[i] = getchar(); // (1)
        if (c[i]=='$')

        c[i] = getchar(); // (2)
        if (*(c+i)=='$')

        *(c+1) = getchar(); // (3)
        if (c[i]=='$')

(3)工作正常,没有问题发生但在(1)和(2)中,输出只是输入的第一个字符,无论字符串输入多长时间

  

Ex:输入asdads $

     

输出:a

所以问题出在getchar()代码中,使用指针和数组的直接元素来获取输入之间有不同之处但是我不知道这里有什么问题

我将此问题称为“A”,因为我遇到了几个问题,因为我尝试使用scanf和getchar的不同类型的代码

现在我将每种情况下的getchar()更改为scanf

(0)(1)(2)(3):问题A发生。现在没有一个与scanf一起正常工作。使用getchar,至少(0)和(3)可以工作。

现在,我将数据输入到d并将d的值传递给c [i]

,而不是将数据直接输入到c中

Usind d = getchar(),问题A发生在所有4个案例中。 scanf给出相同的结果

奇怪的是,当我按下回车键时,程序自动断开并输出打印到屏幕

这只是一个测试,但这是我正在处理的当前问题

    int z;
    printf("continue? [1=yes/0=no] ");
    scanf("%d", &z);
    switch (z){
        case 1: printf("next info is: ");
                scanf("%d", &x);
                break;
        case 0: *end = '\0';
                break;
    }

这项工作正常,使用带有%d的scanf是可以的,它等待我按1或0继续该过程。但是,这两个代码预计会执行相同的问题。他们不等我打y / n但直接到最后

    char z;
    printf("continue? [y/n] ");
    z=getchar(); // using getchar
    if(z=='y'){
                printf("next info is: ");
                scanf("%d", &x);

    }
    else{

        *end = '\0';
    }

    char z;
    printf("continue? [y/n] ");
    z=getchar();
    switch(z=='y'){
        case 1: printf("next info is: ");
                scanf("%d", &x);
                break;
        case 0: *end = '\0';
                break;
    }

所以我不知道我使用的代码有什么问题,为什么使用指针获取数据与直接使用数组不同。

2 个答案:

答案 0 :(得分:1)

是的!首先必须使用scanf("%d",&index);,你已经错误地使用了它。你必须传递变量的地址。

其次,在输入缓冲区中,在给定输入之后按下'\ n'。你必须在这里放一个虚拟的getchar,它将消耗任何额外的'\ n'。

scanf("%d", index);
getchar();
    for(i=0; i<index; i++){
        *(c+i) = getchar();
        if (*(c+i)=='$')
            break;
    }

现在在第二种情况下(使用int作为输入)它的作用为'\ n'(或任何空格)scanf忽略了字符(格式指定为“%d”不是“%c”)。

答案 1 :(得分:1)

#include <stdio.h>
int main()
{
    int i, index;
    char d, c[20];
    scanf("%d",index);//*2
    for(i=0; i<index; i++){
    c[i] = getchar(); // (1)
    if (c[i]=='$')
        break;
}
printf("%d",index); //*1
printf("the string is %s", c);
return 0;
}

如果你打印没有。索引(* 1)你知道什么时候某些情况索引= 1.字符串中唯一的空格是NULL。所以,你的程序有一些问题,它不是(1)(2)的问题)(3)。

您可以更改程序:

* 2到scanf("%d",&index);

在那之后,你将成功地完成(1)(2)(3)。