【问题标题】:C - strcmp won't work with scanf()C - strcmp 不适用于 scanf()
【发布时间】:2017-07-02 21:44:44
【问题描述】:

我正在尝试将 scanf() 与 strcmp 一起使用。但是,它不起作用。我已经包含了正确的头文件。我试过gets()。它可以工作,但我不想受到缓冲区溢出攻击。

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

int main() {
    char a[100] = "Hello World!";
    char b[100];

    scanf("%s", &b);

    if(strcmp(a, b) == 0) {
        printf("This should work!\n");
    }
}

我编译程序。然后,输入 Hello World!进入程序。它不会显示消息。还有,为什么 strcmp() 会显示各种返回值?

请帮忙。

【问题讨论】:

  • %s of scanf 不包含空格。
  • 您尝试打印 b 吗?
  • 打印b 永远不会成功,除非您使用不同的文本进行测试,并且只有一个单词。如果您输入“Hello world”并询问b,您将收到“Hello”作为回答。
  • @DavidBowling scanf("%99[^\n]", b); 在用户只输入"\n" 时也是一个问题。
  • @DavidBowling 问题是人们经常期望b[] 更新了其中的数据。而像'\n' 这样的输入不会发生。是的,检查scanf() 的返回值是很好的编程来检测这种情况。

标签: c scanf


【解决方案1】:

阅读有关 scanf 的手册——您会看到它在找到的第一个空白处停止扫描 %s

scanf("%s", b);

的 你好世界

会给你Hello而不是Wolrd

另请注意,scanf 同样容易受到缓冲区溢出的影响,因为您仍然没有限制 %s 中输入的大小——要限制输入,您可能应该尝试执行%99s 确保您没有阅读超过 100 字节的缓冲区仍然为 null 终止留有空间。

根据this 的问题,您需要类似的东西

scanf("%[^\n]",str)

要阅读所有内容直到换行,并将其与长度限制相结合,您需要类似

scanf("%99[^\n]",str)

【讨论】:

  • 好的。我该如何解决它,以便它同时使用这两个词?
  • 你不要使用scanf;你需要像fgets 这样的东西。你需要在最后修剪回车。
  • scanf(" %[^\n]",str) 不会读取“直到换行符的所有内容”。它首先消耗包括换行符在内的前导空格 - 然后读取所有内容直到下一个换行符。
  • @Soren: strcspn() 在第一个换行符或空字节处停止。由于fgets() 总是包含一个空字节,即使它没有到达换行符,strcspn() 成语是安全的。
  • 注意scanf("%99[^\n]",str)(带或不带99)如果行输入只有"\n"-->str没有改变并且'\n'保留在stdin中会有问题。 fgets() 是一个更好的工具来实现 line
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-23
  • 1970-01-01
相关资源
最近更新 更多