【问题标题】:How can I stop receiving input with a input in C如何停止接收输入与 C 中的输入
【发布时间】:2021-07-11 22:25:36
【问题描述】:

我需要不断地从用户那里获取命令,为此我写了这个:

scanf("%s %d %s %d", str1, &num1, str2, &num2);

用户应该输入如下内容:

move 8 over 3

当用户键入exit 并输入时,就这一行,我必须停止阅读并打印结果。问题是,我不知道该怎么做。 代码上下文:

do{
    scanf("%s %d %s %d", str1, &num1, str2, &num2); 

    do_stuff(vp, str1, str2, num1, num2, size);
}while (strncmp(str1, exit, 4)); // I used this but I must write (exit 1 exit 1) at least.

strncmp() 中,exit 是一个字符串,带有“exit”,因此比较这四个前字符我可以停止循环,但我必须输入所有四个预期的输入。

【问题讨论】:

  • 不要将scanf 用于可变输入格式。使用fgets 获取一行,然后使用sscanfstrtok 解析该行。例如,使用sscanf 仅获取第一个单词,检查是否为"exit",然后通过退出或解析字符串的其余部分进行相应处理。
  • 但这会读取空间吗?
  • 你指的是什么空间?为什么这很重要?请说清楚一点。
  • 例如,我将只写一行move 6 over 3。在你的方式中会不会读全行?或者只是第一个空格之前的单词?
  • fgets 读取整行。然后,您可以使用 sscanfstrtok 将其拆分。这称为“标记化”。

标签: c loops input scanf


【解决方案1】:

你可以试试这个:

while ((scanf("%s", &str1) == 1) && strcmp(str1, "exit")) {
     scanf("%d %s %d", &num1, str2, &num2);

     do_stuff(vp, str1, str2, num1, num2, size);
}

我做了这个示例代码,它对我有用,基本上这让我们为需要的四个变量输入值并在 strcmp(str1, "exit") == 0 时停止循环,注意在两个 scanf() 中输入了 4 个值,我不知道对缓冲区有什么影响。

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

void do_stuff(char *str1, char *str2, int num1, int num2) {
    printf("     entered: %s %d %s %d\n", str1, num1, str2, num2);
}

int main() {

    char str1[100], str2[100];
    int num1 = 0, num2 = 0;

    while ((scanf("%99s", &str1) == 1) && strcmp(str1, "exit")) {
        scanf("%d %99s %d", &num1, str2, &num2);

        do_stuff(str1, str2, num1, num2);
    }
    printf("     loop finish!");

    return 0;
}

命令行:

move 8 over 3
     entered: move 8 over 3
move 4 over 2
     entered: move 4 over 2
exit
     loop finish!

【讨论】:

  • @chux-ReinstateMonica 是的,那会更好,编辑帖子..
  • @chux-ReinstateMonica 哈哈,我想我在之前的测试中忘记了它
【解决方案2】:

正如 kaylum 指出的,在这种情况下最好使用fgets。这将立即为您提供整条线,但更重要的是,它允许您设置最大尺寸。如果scanf 读取的输入超出缓冲区的容量,它将覆盖缓冲区,这是很危险的。

char line[MAX_LINE]; // MAX_LINE should be a maximum input you define
while(fgets(line, sizeof line, stdin)) {
    char str1[MAX_LINE];
    char str2[MAX_LINE];

    if(strcmp(line, exit) == 0)
        break;

    // sscanf works like scanf, except it reads from a string
    // it is safer because you now have a string of a maximum size
    int r = sscanf(line, "%s %d %s %d", str1, &num1, str2, &num2);
    if(r == 4)
        do_stuff(vp, str1, str2, num1, num2);
    else
        puts("Wrong input format. Try again");
}

【讨论】:

    猜你喜欢
    • 2017-09-01
    • 2020-06-08
    • 1970-01-01
    • 2015-11-30
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    相关资源
    最近更新 更多