【问题标题】:C infinite loop issue when prompting提示时出现C无限循环问题
【发布时间】:2012-11-01 19:59:48
【问题描述】:

为什么在这段代码中它会执行无限循环而不再次提示用户

#include <stdio.h>
#include <string.h>
#include <ctype.h>

void to_rot13(char* value);

int main(){
    char word[1024];
    printf("C ROT13\nSome data to code or decode\n");
    while (1){
        printf(": ");
        scanf("%[^\n]s", word);
        to_rot13(&word);
        printf(": %s\n", word);
    }
    return 0;
}


void to_rot13(char* value){
    unsigned int x;
    for (x = 0; value[x] != '\0'; x++){
        if ((value[x] < 'A') || (value[x] > 'Z' && value[x] < 'a') || (value[x] > 'z')){}
        else if (tolower(value[x]) <= 'm'){value[x] = value[x] + 13;}
        else{value[x] = value[x] - 13;}
    }
}

我想再次提示用户 我不能再精确了。

【问题讨论】:

    标签: c infinite-loop scanf rot13


    【解决方案1】:
    scanf("%[^\n]s", word);
    

    将换行符留在输入缓冲区中,因此下一个scanf 立即返回而不读取任何进一步的输入,因为缓冲区中留下的第一个char 是换行符。您需要从输入缓冲区中删除换行符。

    int c;
    do {
        c = getchar();
    }while(c != '\n' && c != EOF);
    if (c == EOF) {
        exit(EXIT_FAILURE); // input borked
    }
    

    另外,请注意编译器的警告并将word 而非&amp;word 传递给to_rot13

    【讨论】:

    • 它不会把它留在缓冲区中以供下一次只读(所以你只会得到一个重复,而不是无限重复)?
    • 否,下一个 scanf 再次读取,直到找到一个换行符,然后将其留在缓冲区中。
    【解决方案2】:

    您正在发送 &word 到 to_rot13(您应该发送 word 或 &word[0])

    【讨论】: