【问题标题】:Reading user input and stop on empty string读取用户输入并在空字符串上停止
【发布时间】:2016-09-10 10:25:30
【问题描述】:

我想读取一些用户输入并对每个输入做一些事情。我使用以下代码做到这一点:

char c;
while(1){
    printf("input");
    c = scanf ( "%s", &c ) ;
}

这很好用。但我需要它接受甚至是空输入。但它只是继续下一行并期望输入非空。我怎么能这样做?

目前情况:

input:asdf
input:b
input:c
input:d
input:e
input:

fjhkjh

预期:

input:asdf
input:b
input:c
input:d
input:e
input:blabla
input:f
input:
input:

cmd 控制台是如何工作的... 更新:我不只阅读一个字符,这是一个例子

【问题讨论】:

  • 你想要%c而不是%s,得到一个简单的char最好使用getcharputchar打印,声明cint
  • char c[3];//or more .. fgets(c, sizeof c, stdin);
  • 当我使用c = getchar() 时,它将为之前在行中引入的每个字符打印一个input:...
  • @BLUEPIXY 有效,您可以将其发布为答案吗? :)

标签: c string input scanf


【解决方案1】:

首先,您不应该使用 %s 将输入存储在单个字符中,因为 %s 用于以空字符 (\0) 结尾的字符串。 不要在 scanf() 中将 &%s 一起使用。 要存储单个字符,请使用:

scanf("%c",&c);

c = getchar();

【讨论】:

  • 可以说c应该被声明为int而不是char使用getchar()(为了检测EOF
  • @asdf,这是在您上次编辑之前回答的,我们无法理解您的想法:P
  • @AlterMann 我知道,我的例子有误导性,对此感到抱歉
  • @asdf,没问题 ;),那么你想要(正如@BLUEPIXY 指出的那样)fgets,但请注意数组中还包含尾随换行符。
  • 是的,我使用了它并选择了换行符。谢谢!
【解决方案2】:

它在内部不是这样工作的,您已将其声明为单个字符,但您使用了 %s 这是一个字符数组。您作为输入获得的字符存储为空值..您给 b c d e 的每个字符都被视为空值.. 如果您有疑问,请在scanf(); 下方添加printf("%s",c);

【讨论】:

  • The char you get as input are stored as null values. 或未存储,或作为垃圾存储...你无法预测未定义行为的行为
【解决方案3】:

首先,在您的代码中,

  scanf ( "%s", &c ) ;

调用undefined behavior。 ,因为您不能将传入的 string 放入 char

也就是说,%s 会跳过前导空白并读取非空白直到紧邻的空白并忽略最后一个空白,因此您不能仅阅读使用%s 的空格。

引用C11,第 7.21.6.2 章,fscanf(),(强调我的

s 匹配一系列非空白字符。

如果不存在l 长度修饰符,则相应的参数应为 指向字符数组的初始元素的指针大到可以接受 序列和一个终止空字符,将自动添加。

因此,我们可以清楚地看到,c 甚至不足以容纳单个 char 输入,否则存储终止 null 将超出访问范围。

您似乎需要getchar() 或类似的。

【讨论】:

    【解决方案4】:

    首先你必须使用 getchar();或 scanf 中的 %c 用于单个字符 那么您可以使用 if 进行测试,它是输入字符

    char c;
    while(1)
    {
     c=getchar();
     if(c==' ')
      break();
    }
    

    这仅适用于单字符输入。

    【讨论】:

      猜你喜欢
      • 2011-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多