1

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

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

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

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

我原来的输入会改变吗?为什么?我的输入一开始没有被正确扫描吗?请尽快回复!

4

3 回答 3

3

这里:

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

您只是将字符读入input[0]. 这对你正在做的事情很好letters,但很明显,当你尝试打印时input,它不会像你期望的那样工作。

当你修复它时,你还需要记住\0在最后一个输入字符之后添加一个终止符。

于 2013-09-28T03:16:39.833 回答
1

你必须做

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

而不是这个

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

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

于 2013-09-28T03:18:04.223 回答
1

scanf循环一次读取您输入的一个字符,并将该字符存储在input[0]. 当scanf循环完全完成时,input[0]包含读取的最后一个字符,其余部分input保持不变。

要修复,您需要在循环i++末尾包含。scanf

顺便说一句,用一次调用填充输入缓冲区fgets然后循环输入缓冲区会更清晰(也更有效):for (i=0; buf[i]!='\0'; i++) { ... }

于 2013-09-28T03:16:32.420 回答