gpt4 book ai didi

c - c中的无限循环问题

转载 作者:太空宇宙 更新时间:2023-11-04 08:30:08 24 4
gpt4 key购买 nike

下面的代码可以编译,但是当我运行它时出现导致无限循环的错误。循环甚至没有到达我应该接受新值的 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);
}
}

最佳答案

您已陷入scanf 陷阱:当您尝试从流(例如文件或stdin)中扫描十进制数时,但流不扫描t 包含有效数字,流将重置为扫描前的位置。这意味着,您的 while 循环会一遍又一遍地扫描相同的无效输入。

一个解决方案是先读取一个字符串(使用scanf("%s", ...) 或使用fgets,然后使用 解析该字符串sscanf 或者使用 strtol 可能更好。所有这些函数都有一个错误条件,在它们的文档中有描述,您应该检查一下。还有一个问题是如何处理意外结束输入过程中可能遇到的文件。

最后,您应该将 flag 设为 get_input 的本地。还可以考虑使用 get_input 返回具有特殊值(例如 -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 应该已经发现了。

关于c - c中的无限循环问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28759136/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com