Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
标志验证不需要';不行。使用数组、scanf函数和strcmp_C_Arrays_String_Scanf - Fatal编程技术网

标志验证不需要';不行。使用数组、scanf函数和strcmp

标志验证不需要';不行。使用数组、scanf函数和strcmp,c,arrays,string,scanf,C,Arrays,String,Scanf,我是初学者。我正在尝试编写一个程序,它将验证我将输入的一些单词与给定的可用单词集,然后比较它们。我在这段代码中使用的是到目前为止我所学到的。 请帮助我了解此代码的错误 所以,当我输入一个单词,比如“flag”,它会打印一个错误 “…第71行:1872信号故障sh”${SHFILE}…” #包括 #包括 #包括 #包括 内部主(空){ 系统(“颜色B0”); char*输入_标志[3]; 字符*可用_标志[3]={“打印”、“扫描”、“标志”}; printf(“\r\n请在此处输入您的标志:”;

我是初学者。我正在尝试编写一个程序,它将验证我将输入的一些单词与给定的可用单词集,然后比较它们。我在这段代码中使用的是到目前为止我所学到的。 请帮助我了解此代码的错误

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

“…第71行:1872信号故障sh”${SHFILE}…”

#包括
#包括
#包括
#包括
内部主(空){
系统(“颜色B0”);
char*输入_标志[3];
字符*可用_标志[3]={“打印”、“扫描”、“标志”};
printf(“\r\n请在此处输入您的标志:”;

对于(int i=0;i而言,代码的主要问题是没有为存储用户输入的值(也称为字符串)保留任何内存

这条线

char *enter_flags[3];
3个字符指针保留内存,但不为字符串(又称字符数组)保留内存

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

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

为避免溢出,您的
scanf
应为:

scanf("%31s", enter_flags[i]);
顺便说一句……

现在,您可能想知道为什么当
char*enter\u flags[3];
错误时,此代码
char*available\u flags[3]=“print”、“scan”、“flag”};
是正确的

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


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

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

这条线

char *enter_flags[3];
3个字符指针保留内存,但不为字符串(又称字符数组)保留内存

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

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

为避免溢出,您的
scanf
应为:

scanf("%31s", enter_flags[i]);
顺便说一句……

现在,您可能想知道为什么当
char*enter\u flags[3];
错误时,此代码
char*available\u flags[3]=“print”、“scan”、“flag”};
是正确的

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


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

您使用的是enter\u flags数组,此变量是指针数组,它是保持不变的拥有自己的地址,因为您只是声明它而没有任何值。您必须指定此变量至少包含6个字符,因为最大的关键字或标志是“print”,并且有5个字符。
解决方案是声明

char enter_flags[3][6];

或者您应该使用malloc函数。

您使用的是enter_flags数组,这个变量是指针数组,它的保持未知地址,因为您只是声明它而没有任何值。您必须指定这个变量至少保持6个字符,因为最大的关键字或标志是“print”,并且有5个字符。
解决方案是声明

char enter_flags[3][6];

或者您应该使用malloc函数。

请回答您的问题并显示输入和预期输出的示例。
scanf(“%s”,&enter_标志[i])
无论如何都是错误的,您的编译器可能发出了警告。但要回答这个问题,请按照我在上一篇评论中写的做。请正确缩进您的代码,并使用大括号使其真正可读。“请帮助我理解此代码的错误。”首先,您需要告诉我们为什么您认为它有问题。您希望它做什么?它做了什么?为什么那么糟糕?请回答您的问题并显示输入和预期输出的示例。
scanf(“%s”),&enter_flags[i])
无论如何都是错误的,您的编译器可能发出了警告。但要回答这个问题,请按照我在上一篇评论中写的做。请正确缩进您的代码,并使用大括号使其真正可读。“请帮助我理解此代码的错误。”首先你需要告诉我们为什么你认为它有问题。你期望它做什么?它做了什么?为什么那么糟糕?