【发布时间】:2021-05-29 13:32:11
【问题描述】:
如果第 5 行的 getchar() 没有被使用,为什么下面的代码在一轮之后就被终止了?
char s;
while(1){
printf("Enter two integers: ");
scanf("%d%d",&a,&b);
getchar();
c = a + b;
printf("Addition of %d & %d is %d\n",a,b,c);
printf("Add more numbers(yes/no): ");
scanf("%c",&s);
if(s == 'y')
continue;
else
break;
}
为什么在下面的代码中使用字符串不起作用?我已经包含了
char s[10];
while(1){
printf("Enter two integers: ");
scanf("%d%d",&a,&b);
getchar();
c = a + b;
printf("Addition of %d & %d is %d\n",a,b,c);
printf("Add more numbers(yes/no): ");
scanf("%s",s);
if(s == "yes")
continue;
else
break;
}
【问题讨论】:
-
s == "yes"您告诉编译器仅将y(数组指向的第一个字符)与yes字符串文字进行比较,这是不匹配的。您需要使用strcmp()。 -
@RohanBari 不是,这里发生了什么。比较中不涉及
y。此比较采用数组s的地址,并与字符串文字"yes"的地址进行比较,后者永远不会为真。 -
试试(第一版)
if (s == 'y') { continue; } else { printf("s is %d\n", s); break; } -
不要问多个问题。专注于一个。
-
如果你只使用变量
s,你引用的不是数组中的第一个字符而是数组本身。它衰减为指向第一个元素的指针。但是由于您前面没有*,因此您不会取消引用它。因此s表示s所在的地址(可能在堆栈上)。左侧是指针。在右侧发生类似的事情。"yes"是一个字符串文字并衰减为指向第一个字符的指针。但同样,你不要取消引用它。最后你比较了两个不能指向同一个地址的指针。