在'C',Linux中,如何中断 while() 循环,不知道中断是否或何时发生

问题描述 投票:0回答:1

我正在寻找一种方法来“中断”程序中的循环构造。 在 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 loops interrupt
1个回答
0
投票

您可以通过多种方式停止 C 中的无限循环(或任何循环构造),从不太剧烈到更加剧烈:

跳出循环的语句

  1. continue;
    - 该语句实际上并不停止循环,而是停止当前迭代。当出于任何原因应跳过当前迭代时,它非常有用。
  2. break;
    - 该语句本身将立即停止循环并在循环结束后从该行继续。
  3. goto LABEL;
    - 这是您应该尽可能避免的一种。这是无条件地从代码跳转到程序中的另一个位置。这“通常”被认为是不好的做法。但是,在一个例子中,它仍然被认为是合适的选择,打破嵌套循环比设置一个“退出标志”更简单,然后打破每个级别的循环。您可以在所有嵌套循环之后设置一个标签,然后在所有循环都应停止的任何条件下 goto 该标签。
  4. return;
  5. - 该语句不仅会跳出循环,而且整个函数都会停止,并且后面输入的任何值都将返回给调用者。这意味着执行
    int x = function()
    将导致
    x
    成为
    function()
    的返回值(假设
    function()
    被声明为
    int function()
  6. exit();
  7. - 这将结束程序。您需要先包含
    ,然后才能使用它。
  8. 针对您的具体情况

在您的情况下,您可能希望在循环中的某个位置(可能是末尾)有一行,就像下面的第一个示例一样,但是,如果循环必须至少执行一次,您也可以更改条件本身或使用

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 写入用于存储用户输入的数组。
    
        
© www.soinside.com 2019 - 2024. All rights reserved.