我的程序从输入中扫描并打印所有使用的大写字母。
我也尝试在程序结束时从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;}
我原来的输入有变化吗?为什么? 我的输入在第一时间没有被正确扫描? 请快速回复!
答案 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 []数组的剩余部分,因此不会更改