【问题标题】:Is "01234|MY_NAME" = "%s|%s"? [duplicate]是“01234|MY_NAME”=“%s|%s”吗? [复制]
【发布时间】:2018-01-09 18:46:43
【问题描述】:

我无法理解这个结果:

    fscanf(FILE,"%s|%s", str1, str2);
    printf("Number:%s, Name:%s", str1, str2);

文件内容:

 01234|MY_NAME

预期输出:

 Number:01234, Name:My_NAME

输出:

 Number:01234|MY_NAME, Name:╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠01234|MY_NAME

有人能解释为什么它会给出这样的输出吗?

P/s:我已经用这段代码解决了:

    fscanf(FILE,"%[^|]|%[^|]", str1, str2);
    printf("Number:%s, Name:%s", str1, str2);

但我还是不明白为什么 "%s|%s" 给出了之前的输出。

【问题讨论】:

  • 您可能会发现documentation for scanf,尤其是格式说明符及其工作方式部分会有所帮助。我怀疑您需要[set] 配置,但您最终会确认这一点。
  • 这种解析工作最好使用fgets(或getline,如果可用)和strtok(或strsep,如果可用)来完成。 scanf 几乎总是比它的价值更麻烦,即使忽略%sgets 一样危险,并且数字溢出会引发未定义的行为。
  • "我还是不明白为什么 "%s|%s" 给出...号码:01234|MY_NAME,姓名:╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠01234|MY_NAME”。 “编号:01234|MY_NAME”是否令人困惑?
  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建minimal reproducible example

标签: c scanf


【解决方案1】:

%s 指令告诉 fscanf 跳过任何初始空白并将 1 个或多个非空白字符读入参数 char *

01234|MY_NAME 都是非空格的,所以它最终被第一个 %s 放置在 str1 中。

然后格式字符串中的| 告诉fscanf 读取文字| 字符。这失败了,因为没有输入。此时fscanf放弃,返回1表示成功填充其中一个变量。

但是,您的程序忽略了来自fscanf 的返回值,因此它没有意识到发生了什么。它盲目地输出str1(包含01234|MY_NAME)和str2(未初始化并打印垃圾,直到碰巧在内存中找到'\0')。

【讨论】:

    猜你喜欢
    • 2023-02-20
    • 1970-01-01
    • 2015-02-23
    • 2014-02-14
    • 2019-08-24
    • 2017-04-13
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多