【问题标题】:Reading different input from scanf - C language [duplicate]从scanf读取不同的输入-C语言[重复]
【发布时间】:2013-10-15 15:33:28
【问题描述】:

我有一个关于从 scanf 读取输入的问题。

用户输入两个命令之一。可以是单字命令,也可以是由一个空格分隔的双字命令。

例如:

开始

开始程序

我正在尝试从 scanf 读取。但我有一个问题。如果我这样做scanf("%s", input);,我假设他只会输入一个单词的命令。

如果我这样做scanf("%s %s", input1, input2); 我假设他将输入一个两字命令。但如果他输入一个单字命令,那么扫描器将不断消耗空白,直到读取到不同的字符。

对于两个单词的命令,我想将每个单词存储在一个单独的字符串变量中。

请帮忙。

【问题讨论】:

  • 您的目标/问题到底是什么?你不知道,用户做了什么并且想要对任一选项做出正确的反应?
  • 请注意,您可以使用 scanf("%s", &input),即与地址运算符一起使用。
  • @PhillipD;不确定input 是指针变量还是只是一个变量。
  • 使用 fgets(),然后使用 sscanf()。请注意,scanf 和 sscanf 都返回解析的变量数。
  • @hacks 是的,你是对的。

标签: c string file-io input scanf


【解决方案1】:

删除格式字符串中的空格,更改:

scanf("%s %s", input1, input2);

作为

scanf("%s%s", input1, input2);

要了解这种行为,请阅读手册:int scanf(const char *format, ...);

一系列空白字符(空格、制表符、换行符等;参见 isspace(3))。该指令 匹配任意数量的空白, 包括无,在输入中

因此,由于第一个 %s 之后的空格,扫描仪会不断消耗空格,直到读取到不同的字符。

阅读:"C Printf and Scanf Reference" 好教程。

相关问题:如果您有兴趣,还请阅读"Store data in array from input" 问题和答案,它将对您有所帮助。

【讨论】:

  • 当我读到这个问题时,我以为他在谈论如何在不知道输入内容的情况下解析一两个字符串。
  • @CharlieBurns 阅读链接的答案以及我对 scanf 和 printf 的引用 ..我确定你喜欢。
  • 这不是我想要的。 Charlie Burns 是对的,我不知道输入的是两个词还是一个词。
  • 您的答案假定它已经是一个两个字的答案。当我尝试输入一个单词命令时,它会等待我输入另一个字符才能继续。
  • @user2817240 看到我给了你scanf()行为的原因,为什么?你到底想问什么还不清楚。要么发布一个新问题。或在评论中提问。
【解决方案2】:

另一种方式,先读第一个词,再有条件地读第二个词,

#include <stdio.h>
#include <string.h>
int main(void)
{
    char cmd[100];
    char cmd1[100],cmd2[100];
    printf("enter command:"); fflush(stdout);
    scanf("%s",cmd1);
    printf("%s\n",cmd1);
    if( strncmp(cmd1,"begin",strlen("begin"))==0 ) {
        printf("read second word\n");
        scanf(" %s",cmd2);
    }
    else strcpy(cmd2,"none");
    printf("%s,%s\n",cmd1,cmd2);
}

结果,

$ ./scanf2 
enter command:start
start
start,none
$ ./scanf2 
enter command:begin command
begin
read second word
begin,command

【讨论】:

  • 谢谢你这确实有效\
  • 我更喜欢 fgets 然后 sscanf 或 strtok 来解​​析输入。
  • @user2817240 很高兴你找到了答案,现在你可能想accept this answer by click on right-mark 表示感谢的最好方式是投票:)
猜你喜欢
  • 2013-12-12
  • 1970-01-01
  • 2015-06-26
  • 2018-08-31
  • 2018-02-15
  • 1970-01-01
  • 2017-11-13
  • 1970-01-01
  • 2019-01-12
相关资源
最近更新 更多