#include <stdio.h> int main() { char ch=' '; scanf("%c",&ch); while(ch != '\n') { if('a'==ch) { ch='*'; } printf("%c",ch); scanf("%c",&ch); } return 0; }为什么不再写一个scanf会陷入死循环
时间: 2023-12-21 12:07:08 浏览: 37
这是因为在输入字符之后,scanf函数会将输入缓冲区中的回车符('\n')留在缓冲区中,下一次执行scanf时,它会读取到这个回车符,认为这是一个有效的输入,然后将其赋值给变量ch,导致循环无法结束。
为了避免这种情况,可以在scanf前加上空格,这样scanf函数会忽略掉输入缓冲区中的所有空格和回车符。修改后的代码如下:
```c
#include <stdio.h>
int main() {
char ch=' ';
scanf(" %c",&ch); // 加上空格
while(ch != '\n') {
if('a'==ch) {
ch='*';
}
printf("%c",ch);
scanf("%c",&ch);
}
return 0;
}
```
相关问题
#include <stdio.h> int main() { char ch=' '; scanf("%c",ch); while(ch != '\n') { if('a'==ch) { ch=='*'; } printf("%c",ch); } return 0; }
这段代码存在一些问题:
1. 在调用scanf函数时,需要传递ch变量的地址,即&ch,否则会导致程序崩溃。
2. 在if语句中,应该使用赋值运算符=而不是相等运算符==,否则无法将ch赋值为*。
3. 在while循环中,需要再次调用scanf函数,否则会导致死循环。
下面是修正后的代码:
```c
#include <stdio.h>
int main() {
char ch=' ';
scanf("%c",&ch);
while(ch != '\n') {
if('a'==ch) {
ch='*';
}
printf("%c",ch);
scanf("%c",&ch);
}
return 0;
}
```
修正后的程序可以将输入的字符串中的所有a替换成*并输出。
这段代码为什么出错#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> int main() { int i = 0; int q = 0; char ch; printf("请输入"); while(scanf("%d", &i) == 1) { q += i; while ((ch = getchar()) == "") ; if (ch == "\n") { break; } ungetc(ch, stdin); } printf("结果是:%d", q); printf("\n"); //system("pause"); return 0; }
这段代码存在以下问题:
1. 宏定义 `_CRT_SECURE_NO_WARNINGS` 是为了禁用 Visual Studio 的编译器警告,但是在其他编译器中可能不被支持。
2. 在 while 循环中,当输入非数字字符时,getchar() 函数得到的是字符,而不是字符串,因此 if (ch == "\n") 判断条件无法成立,应该改为 if (ch == '\n')。
3. 在 while 循环中,当输入非数字字符时,应该通过 getchar() 函数将其从缓冲区中清除,而不是使用 ungetc() 函数将其放回到缓冲区中。可以使用一个 while 循环来清除缓冲区中的非数字字符,例如:
```
while ((ch = getchar()) != '\n' && ch != EOF)
;
```
因此,应该将代码改为:
```
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int i = 0;
int q = 0;
char ch;
printf("请输入");
while (scanf("%d", &i) == 1)
{
q += i;
while ((ch = getchar()) != '\n' && ch != EOF)
;
if (ch == '\n')
{
break;
}
}
printf("结果是:%d\n", q);
return 0;
}
```