标志验证不需要';不行。使用数组、scanf函数和strcmp
我是初学者。我正在尝试编写一个程序,它将验证我将输入的一些单词与给定的可用单词集,然后比较它们。我在这段代码中使用的是到目前为止我所学到的。 请帮助我了解此代码的错误 所以,当我输入一个单词,比如“flag”,它会打印一个错误 “…第71行:1872信号故障sh”${SHFILE}…”标志验证不需要';不行。使用数组、scanf函数和strcmp,c,arrays,string,scanf,C,Arrays,String,Scanf,我是初学者。我正在尝试编写一个程序,它将验证我将输入的一些单词与给定的可用单词集,然后比较它们。我在这段代码中使用的是到目前为止我所学到的。 请帮助我了解此代码的错误 所以,当我输入一个单词,比如“flag”,它会打印一个错误 “…第71行:1872信号故障sh”${SHFILE}…” #包括 #包括 #包括 #包括 内部主(空){ 系统(“颜色B0”); char*输入_标志[3]; 字符*可用_标志[3]={“打印”、“扫描”、“标志”}; printf(“\r\n请在此处输入您的标志:”;
#包括
#包括
#包括
#包括
内部主(空){
系统(“颜色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])
无论如何都是错误的,您的编译器可能发出了警告。但要回答这个问题,请按照我在上一篇评论中写的做。请正确缩进您的代码,并使用大括号使其真正可读。“请帮助我理解此代码的错误。”首先你需要告诉我们为什么你认为它有问题。你期望它做什么?它做了什么?为什么那么糟糕?