【问题标题】:Is there a way to read a c-string and then an int with a single scanf in C?有没有办法在 C 中读取一个 c 字符串,然后读取一个带有单个 scanf 的 int?
【发布时间】:2011-01-31 07:01:49
【问题描述】:

嘿, 我试图让这个函数通过列出的输入获得以下输出,“...”是我不确定要写什么的地方:

void Question8(void)
{
  char sentence[100];    
  int grade;    
  scanf(….);    
  printf("%s %d", sentence, grade);    
}

Input:
My CS Grade is 1000

Output:
My CS Grade is 100

然而,关键是我需要 scanf 来读取一个 c 字符串,然后是一个带有单个 scanf 命令的 int,这甚至可能吗?

编辑: 我只能用三个句点(“...”)编辑该位置的代码,我不能再使用任何东西。我可以假设列出的输入是预期的,但我无法更改三个时段之外的任何内容。 输出不包含拼写错误,这个赋值的目的是使用标志和转义序列。

【问题讨论】:

  • 请在答案底部逐字发布作业。这一直在变化,我们一直在回答。首先你不能假设字符串是什么,然后你可以..如果我们了解老师在帮助家庭作业时想要什么会更好。
  • 您的输入/输出中是否存在拼写错误,或者用户应该输入 1000(一千)的等级并获得 100(一百)的等级作为输出?
  • 不知道是否需要考虑负信用,接受的答案不适用于负整数。

标签: c scanf


【解决方案1】:

可以使用 scanf 读取预先格式化的字符串,但是格式必须严格。 此版本将继续读取输入,直到遇到一个数字,然后读取一个整数。 这是您的代码:

  char sentence[100];
  int grade;
  scanf("%[^0-9] %d",sentence,&grade);
  printf("%s %d\n", sentence, grade);

【讨论】:

  • 这和我一开始的完全一样,但它不起作用。
  • 您确定它不起作用吗?我用我的 GCC 编译器尝试了这个,它似乎可以工作。
  • 我更喜欢@Tony 的版本,它带有边界检查功能是否正确。 +1 让我仔细检查 "%[" 的语法。
  • @Aux:这不起作用,它在is1000之间输出两个空格,并且还输出1000,而不是100
【解决方案2】:

我会尽快解决这个问题的:

<obligatory_rant>
    stupid question, but I guess it's homework and you're
    stuck with these absurd limitations
</obligatory_rant>

然后,如果您需要读取所有内容,但不包括第一位数字,那么数字:

if (scanf("%100[^0-9] %3d", text, &number) == 2)
    ...

注意事项:

  • 100 in "%100[... 应该是您的实际缓冲区大小,以防止缓冲区溢出。
  • %3d 文件中最多 3 位数字应占数值,因此 1000 正确读为 100。
  • [^...] 表示由以下集合中的非 ("^") 字符组成的字符串,然后将其指定为 0-9 - 数字。
  • if (... == 2) 测试两个位置参数是否扫描/转换成功。

如果您无法添加if 和错误消息,那么只需:

scanf("%100[^0-9] %3d", text, &number)

【讨论】:

  • 除了问题中的确切代码行之外,我不能使用任何其他东西。我必须通过一次 scanf 获得必要的输出。
  • @Aux - scanf() 部分是您所需要的。周围的 if(...) 语句是一个安全检查 - scanf 返回它成功分配数据的参数数量(在这种情况下,如果用户以正确的格式输入数据,则为 2),if 语句只是验证这是否发生.如果您的老师希望您编写糟糕的代码,则不需要它。 :P
  • 怎么可能?您问题中的代码使用“%s %d”。 %s 在第一个空格处停止扫描。它不能为您的输入工作。我上面的代码有一个 scanf - 只是格式和参数不同。
  • @Chris:好点子 - 可能是 if 让 Aux 感到困惑......谢谢。
  • 对于scanf()* 表示“抑制分配”,这不是您想要的。您不能在格式字符串中进行可变长度;您必须使用实际长度写入字符串:"%.30[^0-9] %d"。是的,scanf() 很奇怪。
【解决方案3】:

Visual Studio 2008

中测试
#include <stdio.h>

    int main()
    {
      char sentence[100];    
      int grade = 0;    
      scanf("%[^0-9] %d",sentence,&grade);
      printf("%s %d", sentence, grade);   
      return 1;
    }


Input : 
My CS Grade is 100
Output :
My CS Grade is 100

【讨论】:

  • @Aux:这不起作用,它在is1000之间输出两个空格,并且还输出1000,而不是100
【解决方案4】:

这是一个非常可怕的问题。一组正确的 scanf 参数将是 "%14c%3d", sentence, &amp;grade

因为printf 语句中包含一个空格,所以尾随空格不需要存储在句子中。因为输入包含其他空格,所以除了固定长度之外,没有其他解决方案(我可以解决)。整数解析也需要固定长度将1000截断为100

我想不出有什么理由写这样的代码。该代码符合要求,但在任何其他情况下都没有用。我认为这是一个非常糟糕的训练练习。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 2023-01-14
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    相关资源
    最近更新 更多