c中的无限循环问题
Infinite loop issue in c
下面的代码可以编译,但是当我 运行 它时,我有一个导致无限循环的错误。循环甚至没有到达我应该接受新值的 scanf 而只是总是打印提示。我究竟做错了什么导致了这个问题..
#include <stdio.h>
#include <stdbool.h>
//variables
bool flag = false;
int input = 0;
//function protoypes
void get_input(void);
bool is_valid(int);
void print_pattern(int number);
int main(){
get_input();
print_pattern(input);
return 0;
}
void get_input(){
while(flag == false){
printf("please enter an odd number betwen 1 and 9\n");
scanf("%d", &input);
if(is_valid(input)){
flag = true;
}else{
flag = false;
}
}
}
bool is_valid(int number){
if(number == 1 || number == 3 || number == 5 || number == 7 || number == 9){
return true;
}else{
return false;
}
}
void print_pattern(int number){
int i = 0;
for(i = 0; i < number; i++){
printf("%s",i);
}
}
死循环可能是因为你输入的是字符而不是整数。也许这会有所帮助
void get_input(){
char ch;
while(flag == false){
printf("please enter an odd number betwen 1 and 9\n");
scanf("%d", &input);
while((ch=getchar()!= '\n') && ch != EOF); // this flushes the input buffer to get rid of characters.
flag = is_valid(input); // This is better
}
}
我还发现您的代码存在问题。
i
是一个 int 但您在
中使用 %s
(用于字符串)
printf("%s",i);
改为
printf("%d",i);
改为
除非输入奇数,否则循环不会退出。
另外 %s
表示字符串,因此您可能需要将打印语句更改为:
printf("%d",i);
^
不要执行 if else,而是将代码更改为:
flag = is_valid(input);
问题不在循环中。输出中的真正问题(%s 而不是 %d):
void print_pattern(int number){
int i = 0;
for(i = 0; i < number; i++){
printf("%d",i); // output number
}
}
可能在输入缓冲区中:
void get_input(){
while(flag == false){
printf("please enter an odd number betwen 1 and 9\n");
scanf("%d", &input);
while( getchar() != '\n' ); // clean input bufer
if(is_valid(input)){
flag = true;
}else{
flag = false;
}
}
}
还要考虑以下验证函数:
bool is_valid(int number){
return (number % 2); // check number
}
您掉进了 scanf
陷阱:当您尝试从流(例如文件或 stdin
)中扫描十进制数时,但该流不包含有效的数字,流将重置为扫描前的位置。这意味着,您的 while
循环一遍又一遍地扫描相同的无效输入。
一个解决方案是先读取一个字符串(使用 scanf("%s", ...)
或 fgets
,然后使用 sscanf
或更好的 strtol
解析该字符串。所有这些函数都有一个错误条件,在它们的文档中有描述,你应该检查一下。还有一个问题是如何处理你在输入过程中可能遇到的意外文件结束。
最后,您应该将 flag
设为 get_input
的本地。还要考虑 get_input
到 return 具有特殊值的读取值,比如 -1,表示文件结束。
示例实现可能如下所示。
int get_input()
{
char buf[80];
int input = 0;
bool flag = false;
while (flag == false) {
printf("please enter an odd number betwen 1 and 9\n");
if (fgets(buf, sizeof(buf), stdin) == NULL) return -1;
flag = (sscanf(buf, "%d", &input) == 1 && is_valid(input));
}
return input;
}
(是的,以快速而肮脏的方式读取输入以外的内容并不容易。)
其他人已经指出了错误的格式说明符,-Wall
应该已经发现了。
下面的代码可以编译,但是当我 运行 它时,我有一个导致无限循环的错误。循环甚至没有到达我应该接受新值的 scanf 而只是总是打印提示。我究竟做错了什么导致了这个问题..
#include <stdio.h>
#include <stdbool.h>
//variables
bool flag = false;
int input = 0;
//function protoypes
void get_input(void);
bool is_valid(int);
void print_pattern(int number);
int main(){
get_input();
print_pattern(input);
return 0;
}
void get_input(){
while(flag == false){
printf("please enter an odd number betwen 1 and 9\n");
scanf("%d", &input);
if(is_valid(input)){
flag = true;
}else{
flag = false;
}
}
}
bool is_valid(int number){
if(number == 1 || number == 3 || number == 5 || number == 7 || number == 9){
return true;
}else{
return false;
}
}
void print_pattern(int number){
int i = 0;
for(i = 0; i < number; i++){
printf("%s",i);
}
}
死循环可能是因为你输入的是字符而不是整数。也许这会有所帮助
void get_input(){
char ch;
while(flag == false){
printf("please enter an odd number betwen 1 and 9\n");
scanf("%d", &input);
while((ch=getchar()!= '\n') && ch != EOF); // this flushes the input buffer to get rid of characters.
flag = is_valid(input); // This is better
}
}
我还发现您的代码存在问题。
i
是一个 int 但您在
%s
(用于字符串)
printf("%s",i);
改为
printf("%d",i);
改为
除非输入奇数,否则循环不会退出。
另外 %s
表示字符串,因此您可能需要将打印语句更改为:
printf("%d",i);
^
不要执行 if else,而是将代码更改为:
flag = is_valid(input);
问题不在循环中。输出中的真正问题(%s 而不是 %d):
void print_pattern(int number){
int i = 0;
for(i = 0; i < number; i++){
printf("%d",i); // output number
}
}
可能在输入缓冲区中:
void get_input(){
while(flag == false){
printf("please enter an odd number betwen 1 and 9\n");
scanf("%d", &input);
while( getchar() != '\n' ); // clean input bufer
if(is_valid(input)){
flag = true;
}else{
flag = false;
}
}
}
还要考虑以下验证函数:
bool is_valid(int number){
return (number % 2); // check number
}
您掉进了 scanf
陷阱:当您尝试从流(例如文件或 stdin
)中扫描十进制数时,但该流不包含有效的数字,流将重置为扫描前的位置。这意味着,您的 while
循环一遍又一遍地扫描相同的无效输入。
一个解决方案是先读取一个字符串(使用 scanf("%s", ...)
或 fgets
,然后使用 sscanf
或更好的 strtol
解析该字符串。所有这些函数都有一个错误条件,在它们的文档中有描述,你应该检查一下。还有一个问题是如何处理你在输入过程中可能遇到的意外文件结束。
最后,您应该将 flag
设为 get_input
的本地。还要考虑 get_input
到 return 具有特殊值的读取值,比如 -1,表示文件结束。
示例实现可能如下所示。
int get_input()
{
char buf[80];
int input = 0;
bool flag = false;
while (flag == false) {
printf("please enter an odd number betwen 1 and 9\n");
if (fgets(buf, sizeof(buf), stdin) == NULL) return -1;
flag = (sscanf(buf, "%d", &input) == 1 && is_valid(input));
}
return input;
}
(是的,以快速而肮脏的方式读取输入以外的内容并不容易。)
其他人已经指出了错误的格式说明符,-Wall
应该已经发现了。