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

the input buffer in getchar() and scanf

抱歉,我想不出更好的标题 我在处理输入时遇到问题 这是我的测试代码,它将输入输入到一个字符串数组中,然后再次在屏幕上打印它,非常简单

第一个测试代码按预期工作正常

#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: type asdads$

output: a

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

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

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

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

现在,我不再将数据直接输入到 c,而是将数据输入到 d,并将 d 的值传递给 c[i]

使用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 = '[=15=]';
                break;
    }

这项工作很好,将 scanf 与 %d 一起使用没问题,它等待我点击 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 = '[=16=]';
    }

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

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

是的!首先必须使用 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'(或任何白色 space)工作是字符被 scanf(指定的格式是“%d”而不是“%c”)。

#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;
}

如果你 printf 没有。 of index(*1) 你会知道什么时候 index = 1。唯一的 space 是 string.So 中的 NULL,你的程序有问题,不是 ( 1)(2)(3).

您可以更改程序:

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

之后你就可以顺利完成(1)(2)(3)了。