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

时间:2017-10-24 08:54:26

标签: 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;
}

我理解了我的错误。谢谢大家!

2 个答案:

答案 0 :(得分:5)

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

这一行

char *enter_flags[3];

3个char指针保留内存,但没有字符串的内存(也称为char数组)。

相反,你可以做类似的事情:

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个char指针。必须有用于存储用户输入的存储器。您可以通过使enter_flags成为2维char数组来实现这一目的。在C中,2维char数组可以用作字符串数组。

答案 1 :(得分:1)

你正在使用enter_flags数组,这个var是指针数组,它只保存未知地址,因为你只是声明它没有任何值。你必须指定这个varibles至少保存6个字符,因为最大的关键字或标志是&#34; print&#34;并有5个字符 解决方案正在宣布

char enter_flags[3][6];

或者您应该使用malloc函数。