为什么我的输入不能正确打印?

时间:2013-09-28 03:05:53

标签: c printf scanf

我的程序从输入中扫描并打印所有使用的大写字母。

我也尝试在程序结束时从stdin打印原始输入。

但是当我使用printf时,它似乎跳过了输入表达式的第一部分,在我的字符数组中打印剩余的东西。请帮我看看问题所在。 -comments in code-

#include <stdio.h>

int main(void){

char input[81];
int letters[91];
int i;

    //initialize arrays input and letters
for (i = 0; i < 90; i++) letters[i] = 2;
for (i = 0 ; i < 80; i++) input[i] = 'a';
i = 0;  

    //reads into input array until EOF
while((scanf("%c",input)!= EOF)){

    //checks input for characters A-Z 
    if((input[i]>= 'A' && input[i]<= 'Z'))


       letters[input[i]] = 1;
    }

    //prints capital letters from input that occur at least once
for(i = 'A'; i < 'Z'; i++){
    if (letters[i]==1)
    printf("%c", i);}        // this output works fine, the scan worked??


//print blank line
printf("\n\n");


// print input
printf("%s\n", input);      //This is where the incorrect output comes from.  

return 0;}

我原来的输入有变化吗?为什么? 我的输入在第一时间没有被正确扫描? 请快速回复!

3 个答案:

答案 0 :(得分:3)

下面:

while((scanf("%c",input)!= EOF)){

你只是在input[0]读取字符。这对于您为letters所做的工作来说很好,但显然当您尝试打印input时,它不会按预期工作。

修复后,您还需要记住在最后一个输入字符后添加终止\0

答案 1 :(得分:1)

scanf循环一次读取您输入的一个字符,并将该字符存储在input[0]中。 scanf循环完全结束后,input[0]包含最后读取的字符,其余input未被触及。

要修复,您需要在i++循环结束时加入scanf

顺便说一句,通过对fgets的单次调用来填充输入缓冲区然后通过输入缓冲区循环:for (i=0; buf[i]!='\0'; i++) { ... }

会更清晰(也更有效)

答案 2 :(得分:1)

你必须

while((scanf("%c",&input[i])!= EOF))
{i++;}

而不是

while((scanf("%c",&input)!= EOF))
{}

您正在做的是每次将字符扫描到数组中第一个元素的地址,因此它会一次又一次地被覆盖。未访问input []数组的剩余部分,因此不会更改