说明:
提示用户最多输入一个或两个空格分隔的令牌 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的无尽程序。我需要有关循环条件的帮助。
答案 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);