我正在寻找一种方法来“中断”程序中的循环构造。 在 while(1) 循环内,有 STDIN 输入。仅当输入发生时, 循环是否继续。我一直在研究线程、信号和其他 使这项工作发挥作用的可能方法。我不确定什么更适合。 该代码显示了一个检查文件是否存在的函数。如果 发现,我希望就该事件做出进一步的决定。是否 fscanf() 的阻塞性质会使任何线程或信号方法无效吗?
#include <stdio.h>
#include <stdbool.h>
#include <unistd.h> // for sleep()
int main(void);
int filefound(void);
int filefound() {
// code to look for a file
// if found, return 'true'
return(false); // file not found
}
int main() {
char instring[25];
while (1) {
printf("\nType bad words: ");
fscanf(stdin, "%[^\n]%*c", instring);
if (filefound() == true)
printf("\nFILE FOUND\n");
printf("\nPotty mouth...\n");
sleep(3);
}
return(0);
}
持续研究和尝试/错误。
您可以通过多种方式停止 C 中的无限循环(或任何循环构造),从不太剧烈到更加剧烈:
continue;
- 该语句实际上并不停止循环,而是停止当前迭代。当出于任何原因应跳过当前迭代时,它非常有用。break;
- 该语句本身将立即停止循环并在循环结束后从该行继续。goto LABEL;
- 这是您应该尽可能避免的一种。这是无条件地从代码跳转到程序中的另一个位置。这“通常”被认为是不好的做法。但是,在一个例子中,它仍然被认为是合适的选择,打破嵌套循环比设置一个“退出标志”更简单,然后打破每个级别的循环。您可以在所有嵌套循环之后设置一个标签,然后在所有循环都应停止的任何条件下 goto
该标签。return;
int x = function()
将导致 x
成为 function()
的返回值(假设 function()
被声明为 int function()
)
exit();
,然后才能使用它。
do...while
循环:
最后休息:#include <string.h>
...
while (1) {
...
if (strncmp(strupr(instring), "EXIT") == 0) break;
}
改变条件
#include <string.h>
#include <stdlib.h>
#define LENGTH 25
...
char instring[LENGTH];
memset(instring, 0, LENGTH * sizeof(char));
...
while (strcmp(strupr(instring), "EXIT") != 0) {
...
}
使用 do-while 循环
#include <string.h>
#include <stdlib.h>
#define LENGTH 25
...
char instring[LENGTH];
memset(instring, 0, LENGTH * sizeof(char));
...
do {
...
} while (strcmp(strupr(instring), "EXIT") != 0)
其中任何一个都将以尽可能最佳的方式实现您的要求。事实上,如果经过优化后,它们都会产生相同或几乎相同的机器代码,我不会感到惊讶。
说明
strcmp(const char * first, const char * second)
first
和 second
- 并返回正数、负数或零。当它返回零时,字符串是相同的。strupr(char * str)
str
更改为大写,然后返回指向修改后的字符串的指针。memset(char * buffer, int value, size_t length)
length
中的 buffer
字节内存设置为值 value
。在这种情况下,将全 0 写入用于存储用户输入的数组。