扫描并打印字符串

时间:2015-05-06 11:33:51

标签: c c-strings

我写了一个非常基本的代码,似乎无法让它工作。

char *a;
scanf("%s",a);
printf("%s",a);

输入:aWord

输出:空

我在哪里错了?为什么我得到空输出? 我尝试了以下操作,它按预期工作,为什么会这样?

char a[50];
scanf("%s",a);
printf("%s",a);

输入:aWord

输出:aWord

我认为使用上述两种方法在c中声明一个字符串是等效的吗?

2 个答案:

答案 0 :(得分:2)

char *a;

此处,a只是char*类型的指针。它指向一些"随机"地点。没有任何内存分配给它。写入此无效内存位置会调用Undefined Behavior。只有在

时才能写入此位置
  1. 使用a / malloc动态分配calloc的内存。
  2. a指向有效的内存位置:

    char buffer[100];
    a = buffer;
    
    // Now you can write to `a`. 
    
  3. 下面:

    char a[50];
    

    内存自动分配给堆栈上的a。所以,你可以写到这个内存位置。

答案 1 :(得分:0)

TL:DR - 您的第一个代码段生成undefined behaviour,您的第二个代码段有效。

案例1:

char *a;
scanf("%s",a);
printf("%s",a);

此处,a未初始化。在scanf()中使用它会调用UB。

案例2:

char a[50];
scanf("%s",a);
printf("%s",a);

这里,a是正确分配的内存(在编译时本身)。因此,它可以安全地与scanf()一起使用。

但是,我建议使用

scanf("%49s",a);    

以避免可能的内存溢出。