【问题标题】:Make while loop not print when user enters "quit" (still prints STR after user says quit but program ends)当用户输入“退出”时,不打印while循环(在用户说退出但程序结束后仍然打印STR)
【发布时间】:2018-03-09 17:04:14
【问题描述】:

说明:

提示用户输入一个或两个标记,以空格分隔,最多输入 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 的 Endless 程序。我需要有关循环条件的帮助。

【问题讨论】:

  • 第一步scanf("%[^\n]s", buff); --> fgets(buff, sizeof buff, stdin); 第二步:strtok(NULL, " "); --> strtok(NULL, " \n");

标签: c string loops while-loop scanf


【解决方案1】:

这里:

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);

【讨论】:

  • 感谢它在我输入“退出”时程序结束,但输出仍然是 STR。我需要程序不输出任何东西。
  • 不客气,更新了我的答案@yoobi,请接受它,因为它回答了你的问题。
  • ok but if (sizeof(buff) - 1
  • 你有什么问题@yoobi?
猜你喜欢
  • 2019-03-19
  • 2014-02-16
  • 2018-05-03
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 2017-12-14
  • 1970-01-01
  • 2018-07-25
相关资源
最近更新 更多