【问题标题】:the input buffer in getchar() and scanfgetchar() 和 scanf 中的输入缓冲区
【发布时间】:2015-05-23 23:14:25
【问题描述】:

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

第一个测试代码正常工作

#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) 中,输出只是输入的第一个字符,无论字符串输入多长时间

例如:输入 asdads$

输出:a

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

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

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

(0)(1)(2)(3):问题 A 发生。现在它们都不能与 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 = '\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;
    }

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

【问题讨论】:

  • scanf("%d", index); 不正确。
  • scanf("%d", ...); 不消耗在 整数之后输入的 '\n'。还在stdin等待下一次输入操作。

标签: c input io scanf getchar


【解决方案1】:

是的!首先必须使用scanf("%d",&amp;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”)。

【讨论】:

  • 感谢您的解释,似乎使用地址解决了第一种情况但第二种情况我使用getchar而不是scanf并且不知道程序如何甚至没有等待我输入char .
  • @aukxn.:我已经提到 getchar() 从标准输入中获取一个字符。由于 '\n' 存在,它会使用它并清除缓冲区。如果答案令人满意,请接受/赞成。(这就是使帖子对未来用户有用的原因)检查此以获取更多信息stackoverflow.com/tour
  • 很抱歉没有足够的代表来支持你。所以如果在第二种情况下我使用扫描,它会忽略任何字符,如 \n \t \0 等,程序将按预期运行?
  • @aukxn.:是的!自己检查一下
【解决方案2】:
#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 没有。的 index(*1) 你会知道什么情况下 index = 1。唯一的空间是字符串中的 NULL。所以,你的程序有问题,不是 (1)(2)( 3).

您可以更改程序:

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

之后,您将成功遵守 (1)(2)(3)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-08
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多