gpt4 book ai didi

c - scanf 接受一个带空格的字符串,然后接受一个 char

转载 作者:行者123 更新时间:2023-12-04 02:36:58 25 4
gpt4 key购买 nike

int main(int argc, char const *argv[]) {
int id = access_queue();
char priority;
char message[100];

while (message != "") {
printf("Enter message:\n");
int result = scanf("%[^\n]s", message);

if (result == 0) {
write_value(id, "", '3');
break;
}
printf("Enter priority:\n");
priority = getchar();
scanf(" %c", &priority);

if (priority == '1' || priority == '2' || priority == '3')
write_value(id, message, priority);
else
printf("Priority must 1, 2 or 3 (1 being the highest)\n");
}
}

好的,所以我有这段代码,它应该从终端获取消息,然后请求优先级,直到消息为空。问题是在询问优先级并获得值后,它返回到“输入消息”并且没有通过输入采用空字符串。

最佳答案

您的代码中存在一些问题:

  • while (message != "") 始终为 false:message == "" 比较数组 message 和字符串常量 "" 存储在内存中的数组。您不能将字符串与 == 进行比较,您必须使用 strcmp() 或简单地使用 while (*message != '\0') 但是 message 未初始化,因此此测试具有未定义的行为。只要用户不输入空字符串,您可能只想迭代循环,因此使循环成为无限循环并显式测试终止条件。

  • scanf("%[^\n]s", message); s 不正确,字符类规范停止在 ] .

  • if (result == 0) 还不够:scanf() 将在文件末尾返回 EOF,所以你应该测试 if (result != 1)

  • priority = getchar() 将读取挂起的换行符,scanf("%c", &priority) 无论如何都会忽略它,删除此行。

  • scanf("%c", &priority) 将从用户读取下一个非空白字符,但会将用户输入的其余行留在输入流中,包括换行符,这将导致下一次迭代失败,因为第一个可用字符将是换行符,导致 scanf() 返回 0。

修改后的版本:

#include <stdio.h>

int main(int argc, char *argv[]) {
int id = access_queue();
char priority;
char message[100];

for (;;) {
printf("Enter message:\n");
int result = scanf("%99[^\n]", message);
if (result != 1)
break;
printf("Enter priority:\n");
if (scanf(" %c", &priority) != 1)
break;
if (priority == '1' || priority == '2' || priority == '3')
write_value(id, message, priority);
else
printf("Priority must 1, 2 or 3 (1 being the highest)\n");

/* read and ignore the rest of the line entered by the user */
while ((c = getchar()) != EOF && c != '\n')
continue;
}
write_value(id, "", '3');
return 0;
}

关于c - scanf 接受一个带空格的字符串,然后接受一个 char,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61294981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com