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你什么意思?那确实跳过了所有的空格。