输入一个错位敲出的字符串,输出打字员本来想打出的句子

#include
char *s = "`1234567890-=QWERTYUIOP[]\ASDFGHJKL;'ZXCVBNM,./";
int main()
{
int i, c;
while((c = getchar()) != EOF) {
for(i = 1; s[i] && s[i] != c; i ++);
if(s[i]) putchar(s[i-1]);
else putchar(c);
}
return 0;
}

for循环里的s[i] && s[i] != c该如何理解呢?

另外你的换行、缩进以及while循环中把判断和赋值写在一起,这些都要注意。

 s[i] && s[i] != c
其实是
s[i] != '\0' && s[i] != c
这种程序写法不值得你学习模仿。

在C里,'\0'表示字符串结束
这里用while循环更好
推荐这么写

原写法
for(i = 1; s[i] && s[i] != c; i ++);
应该写

 i = 1;
while (s[i] != '\0')
{
    if (s[i] == c)
            break;
    i++;
}

写程序绝对不是卖弄技巧和越短越好。

        for(i=1;s[i]!='\0';i++){
            if(s[i]==c) break;
        }

这个程序就是每次输入一字符,然后在指定的字符串内找到这个字符的位置,然后输出这个这个字符的前面的 字符
所以相输出123456789 QWERTYUIOP[]\ASDFGHJKL ZXCVBNM
可以在键盘先后输入:
234567890- 回车
WERTYUIOP[ -回车
SDFGHJKL;回车
XCVBNM,回车

        for(i=1;s[i]!='\0';i++){
            if(s[i]==c) break;
        }

这个程序就是每次输入一字符,然后在指定的字符串内找到这个字符的位置,然后输出这个这个字符的前面的 字符
所以相输出123456789 QWERTYUIOP[]\ASDFGHJKL ZXCVBNM
可以在键盘先后输入:
234567890- 回车
WERTYUIOP[ -回车
SDFGHJKL;回车
XCVBNM,回车