C/Reading中的前瞻
我写了这段代码,作为一种前瞻C/Reading中的前瞻,c,segmentation-fault,user-input,scanf,C,Segmentation Fault,User Input,Scanf,我写了这段代码,作为一种前瞻 int main() { char a[100]; char b[100]; scanf("%s", a); if (a[0] == '@') { scanf("{%s}", b); } printf("%s\n", b); } 由于某种原因,我在第一次按enter键后得到一个segfault,我的输入是@hi。发生了什么事?您的第一段代码(编辑之前)中的问题是您创建了一个存储2个字符的字符串。“0”
int main() {
char a[100];
char b[100];
scanf("%s", a);
if (a[0] == '@') {
scanf("{%s}", b);
}
printf("%s\n", b);
}
由于某种原因,我在第一次按enter键后得到一个segfault,我的输入是
@hi
。发生了什么事?您的第一段代码(编辑之前)中的问题是您创建了一个存储2个字符的字符串。“0”和空值。然后尝试用scanf
中的4个字符覆盖此内容
在第二段代码中,您没有将char指针指向任何地方。您只是声明了它,没有给它一个值,所以它可以指向任何东西
要获得所需的行为,需要创建如下字符数组:
char a[100];
char b[100];
您必须使阵列足够大,以满足您的需要
此外,如果您想读取中的两个字符串,则必须“使用”它们之间的空白。为此,请将第二个scanf
更改为:
scanf(" {%s}", b);
注意{
scanf(“%s”,a);
之前的空格,根据,尝试将字符串(%s
)存储在格式(a
)后面的指针参数所指向的位置在这种情况下,<代码> A<代码>未初始化,并没有指向任何存储空间。要读取单个字符,请考虑此示例:
int main(int argc, char **argv)
{
char c;
/* among other things, read a character */
scanf("%c", &c);
return 0;
}
扩展它以获得预期的行为。此外,我建议您避开
scanf
,在阅读fgets
时进行匹配。您在此处犯的错误与此处相同:()-您正在覆盖一个仅1个字符长的全局存储字符串。唉,我发誓,50%的代表来自这些问题。我不太理解链接问题中的错误…o。O@quasiverse:这就是为什么我要把这些放在外面。@tekknolagi现在你正在创建一个不指向任何地方的字符指针。这甚至是worse、 我这样做了,现在当我scanf
时,b
的结果完全是胡说八道。@tekknolagi您键入了什么?@tekknolagi而不是scanf({%s},…)
尝试scanf({%s},…)
。注意空格。哦……对了。我怎么能让它跳过所有的空格?@Teknolagi你什么意思?那确实跳过了所有的空格。