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

很抱歉,因为我无法想到任何更好的标题我有一个问题处理输入这是我的测试代码,它将输入到字符串数组然后再次在屏幕上打印,非常简单

第一个测试代码正常工作

#include  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)工作。

现在,我将数据输入到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; } 

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

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

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

 scanf("%d", index); getchar(); for(i=0; i 

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

 #include  int main() { int i, index; char d, c[20]; scanf("%d",index);//*2 for(i=0; i 

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

您可以更改程序:

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

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