标记验证不起作用.使用数组,scanf函数和strcmp

DEN*_*VER 0 c arrays string scanf

我是初学者.我正在尝试编写一个程序来验证我将用一组给定的单词输入的一些单词然后进行比较.我在这段代码中使用的是迄今为止我学到的东西.请帮我理解这段代码有什么问题.

所以,当我输入一个单词,比如"flag"时,它会输出一个错误

"......第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;
}
Run Code Online (Sandbox Code Playgroud)

我理解了我的错误.谢谢你们!

438*_*427 5

您的代码的主要问题是您不保留任何内存来存储用户输入的值(即字符串).

这条线

char *enter_flags[3];
Run Code Online (Sandbox Code Playgroud)

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

相反,你可以这样做:

char enter_flags[3][32];
Run Code Online (Sandbox Code Playgroud)

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

为避免溢出,您scanf应该:

scanf("%31s", enter_flags[i]);
Run Code Online (Sandbox Code Playgroud)

顺便说一句....

现在你可能想知道为什么这个代码char *available_flags[3]= "print","scan","flag"};char *enter_flags[3];出错时是好的.

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

enter_flags是不同的,因为你希望它保存程序可以改变的3个字符串(即通过用户输入).因此enter_flags不能成为3个char指针.必须有用于存储用户输入的存储器.您可以通过制作enter_flags2维char数组来实现这一目标.在C中,2维char数组可以用作字符串数组.