当用户输入"退出"时,不要打印while循环。 (在用户说退出但程序结束后仍然打印STR)

时间:2017-09-28 04:19:52

标签: c string loops while-loop scanf

说明:

  

提示用户最多输入一个或两个空格分隔的令牌   20个字符。

     
      
  • 如果用户在到达换行符之前提供的字符数超过20个,请打印提供的错误消息。
  •   
  • 如果令牌数不正确,请打印相应的错误消息。
  •   
  • 如果输入正确,请打印相应的令牌类型。
  •   
     

提示用户输入(并提供输出),直到用户提供单个STR令牌quit(不区分大小写)。程序应立即退出而不输出。

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

bool isNumeric(char *str); 
void tokenizer(char *token);

int main() {
    char buff[20];
    while (strcmp(buff, "quit") != 0) {
        printf("> ");
        scanf("%[^\n]s", buff);
        if (sizeof(buff) - 1 < strlen(buff)) {
            printf("Input string too long.\n");        
            exit(1);
        }
        char *token;
        tokenizer(token = strtok(buff, " "));
    }
    printf("\n");
    return 0;
}

bool isNumeric(char *str) {
    while (*str != '\0') {
        if (*str < '0' || *str > '9')
            return false;
        str++;
    }
    return true;
}

void tokenizer(char *token) {
    int tokenCount = 0;
    while (token != NULL) {
        tokenCount++;
        if (tokenCount > 2) {
            printf("\rERROR! Incorrect number of tokens found.\n");          
            exit(1);
        }
        if (isNumeric(token)) {
            printf("INT ");
        } else {
            printf("STR ");
        }
        token = strtok(NULL, " ");
    }
}

OUTPUT:一个说STR的无尽程序。我需要有关循环条件的帮助。

1 个答案:

答案 0 :(得分:0)

下面:

int main() {
    char buff[20];
    while (strcmp(buff, "quit") != 0) {
       ...
    }
}

您的代码调用未定义的行为,因为buff未初始化!在循环之前使用scanf()fgets(buff, sizeof buff, stdin);来读取输入一次,或者使用do-while循环而不是while循环。

此外,此strtok(NULL, " ");应该strtok(NULL, " \n");也可以使用换行符作为分隔符,而不仅仅是空格。

你的无限循环来自:

scanf("%[^\n]s", buff);

应该是:

scanf("%s", buff);

你会没事的,因为你不想在那里使用新线。

把所有东西放在一起,你得到:

do {
    printf("> ");
    scanf("%s", buff);
    if (sizeof(buff) - 1 < strlen(buff)) {
        printf("Input string too long.\n");        
        exit(1);
    }
    char *token = strtok(buff, " ");
    tokenizer(token);
} while (strcmp(buff, "quit") != 0);