gpt4 book ai didi

c - 标志验证不起作用。使用数组、scanf 函数和 strcmp

转载 作者:太空宇宙 更新时间:2023-11-04 05:34:10 25 4
gpt4 key购买 nike

我是初学者。我正在尝试编写一个程序来验证我将输入的一些单词与一组给定的可用单词,然后将它们进行比较。我在这段代码中使用的是我目前学到的东西。请帮助我理解这段代码有什么问题。

所以,当我输入一个词时,比如“flag”,它会打印出一个错误

"...line 71: 1872 Sigmentation fault sh"${SHFILE}...

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

int main(void) {
system("COLOR B0");

char *enter_flags[3];

char*available_flags[3]={"print","scan","flag"};

printf("\r\nEnther your flags here please: ");

for(int i=0;i<3;i++){

scanf("%s",&enter_flags[i]);

for(int j=0;j<3;j++){
if(strcmp(enter_flags[i],available_flags[j])==0)
{
printf("---%s---|---%s--- MATCH", enter_flags[i], available_flags[j]);
}

else printf("---%s---|---%s--- INCORRECT", enter_flags[i], available_flags[j]);
}


}
return 0;
}

我明白我的错误。谢谢大家!

最佳答案

您的代码的主要问题是您没有为存储用户输入的值(又名字符串)保留任何内存。

这一行

char *enter_flags[3];

3 个字符指针 保留内存,但没有为字符串(又名字符数组)保留内存。

相反,您可以执行以下操作:

char enter_flags[3][32];

这将允许您存储 3 个最大长度为 31 的字符串(加上所需的零终止)。

为了避免溢出,您的 scanf 应该是:

scanf("%31s", enter_flags[i]);

顺便说一句....

现在您可能想知道为什么这段代码 char *available_flags[3]= "print","scan","flag"};char *enter_flags[3]; 时没问题; 是错误的。

原因是 available_flags 是指向(常量)字符串文字的 3 个字符指针。编译器会将这 3 个字符串放在内存中的某个位置,并使 available_flags 中的指针指向这些字符串。您的代码不会更改这些字符串(并且不允许这样做)。

enter_flags 是不同的,因为您希望它包含 3 个您的程序可以更改的字符串(即通过用户输入)。因此 enter_flags 不能是 3 个字符指针。必须有存储器来存储用户输入。您可以通过使 enter_flags 成为二维字符数组来实现这一点。在 C 中,二维字符数组可以用作字符串数组。

关于c - 标志验证不起作用。使用数组、scanf 函数和 strcmp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46906120/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com