2

我正在尝试使用 setjmp/longjmp 做一些简单的事情:要求用户多次按 Enter 键,如果用户插入其他内容,它将使用 longjmp 重新启动进程。

我正在使用一个计数器来检查它是否有效,这个计数器在开始时为 0,但是当使用 longjmp 时,计数器从 1 重新开始。

#include <stdio.h>
#include <setjmp.h>
jmp_buf buffer;
char inputBuffer[512];

void handle_interrupt(int signal) {
    longjmp(buffer, 0);
}

int main(int argc, const char * argv[]) {
    int counter = 0;
    counter = setjmp(buffer); // Save the initial state.

    printf("Counter: %d\n", counter);

    printf("\nWelcome in the jump game, press enter (nothing else!): \n");
    while (fgets(inputBuffer, sizeof(inputBuffer), stdin)) {
        if (*inputBuffer == '\n') { // If user press Enter
            counter++;
            printf("%d\n\n", counter);
            printf("Again: \n");
        } else {
            handle_interrupt(0);
        }
    }
}

输出:

pc3:Assignement 3 ArmandG$ ./tictockforever
Counter: 0

Welcome in the jump game, press enter (nothing else!): 

1

Again: 

2

Again: 
StackOverflow
Counter: 1

Welcome in the jump game, press enter (nothing else!): 

2

Again: 

我知道这段代码很傻,我只是想在一个简单的例子中使用 setjmp/longjmp。

4

2 回答 2

6

setjmp仅在第一次返回时直接返回 0。

在任何其他情况下,它返回您传递给的任何内容longjmp除非您传递 0
在这种情况下,它返回 1。

于 2014-10-12T20:27:40.033 回答
4

您需要下载 C 标准的副本(例如 Google 的“C11 Draft Standard”)并非常非常仔细地阅读 setjmp / longjmp 的文档。setjmp 与其他函数不同。您对 setjmp 的使用绝对是非法的。关于使用它的唯一合法方式是

if (setjmp (...)) {
    ...
} else {
    ...
}
于 2014-10-12T20:33:39.557 回答