请教大神 这个程序输入1 应该输出1,2;为什么会不断输出无法结束?

#include < stdio.h>
char S[]="`1234567890-=QWERTYUIOP[]\ASDFGHJKL;'ZXCVBNM,./";
int main()
{ char c;int i=1;
while((c=getchar())!=EOF)
{for(i;S[i]!=c;i++)
printf("%d\n",i);}
return 0;
}

while((c=getchar())!=EOF)
你应该用ctrl+z作为结束的输入

getchar()这个函数是会读取回车符的('\n'),也就是说,当你在控制台输入1并按下回车时,其实是执行了两次while循环,第一次c为'1',第二次c为'\n'(回车符)。第一次while循环,由于S[1]=='1'所以没有打印任何数据就跳出 for循环;第二次while循环,由于S数组中不存在'\n'字符,因此无法跳出for循环,也就是死循环,就会不断输出无法结束(其实有可能因为数组越界而程序崩溃)。所以可以在while循环中加一句话if(c == '\n') continue;就可以跳过回车符的情况了。另外遍历数组的结束条件居然没有限制下标不能超过数组大小,这很容易在遍历整个数组都没有找到相等的字符时,循环继续执行导致数组越界。


#include<string.h>
#include < stdio.h>
char S[] = "01234567890-=QWERTYUIOP[]\ASDFGHJKL;'ZXCVBNM,./";
int main()
{
    char c; 
    int i = 1;
    while (((c = getchar()) != EOF) && (c != '\n'))
    {
        for (i; (S[i] != c)&&(i < (strlen(S)-1)); i++)
        {
            printf("%d\n", i);
        }
    }
    system("pause");
    return 0;
}