我需要编写一个程序,从输入中读取一个以新行终止的句子。该程序应该以一个字母“#a;'与'',' b'交换用' y'等等。我不应该使用数组,这就是为什么我找不到解决这个问题的方法。
这是我的代码:
#include<stdio.h>
int main() {
char alphabet, temp;
while( scanf("%c", &alphabet) != '\n') {
for(char i ='a', j='z'; i <= 'z', j>='a'; i++, j--) {
if(alphabet == i) {
temp = j;
}
}
printf("%c", temp);
}
return 0;
}
当我输入:abc作为输出时,我得到zyxxxxxxxxxxxxxxxxxxxxxxxxx(无限数量的x)。
总结一下: 输入:ABC。输出:zyxxxxx(无限个x)。
答案 0 :(得分:3)
你搞砸了scanf
的返回值:
while( scanf("%c", &alphabet) != '\n'){
当输入的字符(在alphabet
中)是换行符时,您想要停止循环。
但是你测试scanf
的返回值,它永远不会是'\n'
,因为它返回转换字段的数量。
你可以尝试这样:
while( scanf("%c", &alphabet) == 1 && alphabet != '\n'){
答案 1 :(得分:2)
在启用警告的情况下编译代码(例如Wall
标志)!这样:
for(char i ='a', j='z'; i <= 'z', j>='a'; i++, j--)
应该给:
warning: left-hand operand of comma expression has no effect [-Wunused-value]
您需要使用逻辑AND运算符&&
而不是逗号之间的逗号。
此外,请改用getchar()
,如下所示:
#include<stdio.h>
int main() {
char temp;
int ch;
while ((ch = getchar()) != '\n' && ch != EOF) {
for(char i ='a', j='z'; i <= 'z'&& j>='a'; i++, j--){
if(ch == i){
temp = j;
}
}
if(ch <= 'z'&& ch >= 'a') // do not print if 'ch' is a digit for example
printf("%c", temp);
}
return 0;
}
输出:
ZYX
如果您必须使用scanf()
,请尝试阅读alphabet
,检查scanf的返回值,并与换行符进行比较,如下所示:
while(scanf("%c", &alphabet) != 0 && alphabet != '\n')