C-strcmp赢得';不能与scanf()一起工作

C-strcmp赢得';不能与scanf()一起工作,c,scanf,C,Scanf,我正在尝试将scanf()与strcmp一起使用。但是,它不起作用。我包含了正确的头文件。我已经试过了。它可以工作,但我不想受到缓冲区溢出攻击的攻击 #include<stdio.h> #include<stdlib.h> #include<string.h> int main() { char a[100] = "Hello World!"; char b[100]; scanf("%s", &b); if(st

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

#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");
    }
}
#包括
#包括
#包括
int main(){
char a[100]=“你好,世界!”;
charb[100];
scanf(“%s”、&b);
if(strcmp(a,b)==0){
printf(“这应该有效!\n”);
}
}
我编译程序。然后,输入helloworld!进入程序。它不会显示消息。还有,为什么strcmp()会显示所有类型的返回值


请提供帮助。

阅读scanf上的手册--您将看到它在找到第一个空格时停止扫描%s

scanf("%s", b);
的 你好,世界

将给您
Hello
,但不会给您
world

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

根据问题,你需要像这样的东西

scanf("%[^\n]",str)
scanf("%99[^\n]",str)
要阅读新行之前的所有内容,并结合长度限制,您需要

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

阅读scanf上的手册--您将看到它在找到第一个空格时停止扫描%s

scanf("%s", b);
的 你好,世界

将给您
Hello
,但不会给您
world

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

根据问题,你需要像这样的东西

scanf("%[^\n]",str)
scanf("%99[^\n]",str)
要阅读新行之前的所有内容,并结合长度限制,您需要

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

%s
scanf
不包含空格。您是否尝试打印b?除非您使用不同的文本进行测试,并且仅使用一个单词,否则打印
b
永远不会成功。如果您输入“Hello world”并询问
b
,您将收到“Hello”作为回答。@DavidBowling
scanf(“%99[^\n]”,b)“\n”
@DavidBowling时,code>也是一个问题,问题是人们常常期望
b[]
中有更新的数据。对于像
'\n'
这样的输入,这不会发生。是的,检查
scanf()
的返回值是检测这种情况的好方法。
scanf
%s
不包括空格。是否尝试打印b?除非使用不同的文本和一个单词进行测试,否则打印
b
永远不会成功。如果您输入“Hello world”并询问
b
,您将收到“Hello”作为回答。@DavidBowling
scanf(“%99[^\n]”,b)“\n”
@DavidBowling时,code>也是一个问题,问题是人们常常期望
b[]
中有更新的数据。对于像
'\n'
这样的输入,这不会发生。是的,检查
scanf()
的返回值是检测这种情况的好方法。确定。我如何修复它,使它同时处理两个单词?您不使用
scanf
;您需要类似于
fgets
的内容。您需要在末尾修剪回车。
scanf(“%[^\n]”,str)
不读取“换行前的所有内容”。它首先使用包括换行符在内的前导空格,然后读取所有内容直到下一个换行符。@Soren:
strcspn()
在第一个换行符或空字节处停止。由于
fgets()
始终包含空字节,即使它没有到达换行符,
strcspn()
习惯用法是安全的。请注意
scanf(“%99[^\n]”,str)
(带或不带99)如果行输入仅为
“\n”
-->
str
未更改,
'\n'
仍保留在
stdin
fgets()
是实现线条的更好工具。OK。我如何修复它,使它同时处理两个单词?您不使用
scanf
;您需要类似于
fgets
的内容。您需要在末尾修剪回车。
scanf(“%[^\n]”,str)
不读取“换行前的所有内容”。它首先使用包括换行符在内的前导空格,然后读取所有内容直到下一个换行符。@Soren:
strcspn()
在第一个换行符或空字节处停止。由于
fgets()
始终包含空字节,即使它没有到达换行符,
strcspn()
习惯用法是安全的。请注意
scanf(“%99[^\n]”,str)
(带或不带99)如果行输入仅为
“\n”
-->
str
未更改,
'\n'
仍保留在
stdin
fgets()
是一个更好的实线工具。