打印字符串时正在打印(null)

时间:2015-11-10 09:03:26

标签: c string pointers printf scanf

我写了一个C程序,它从用户那里获取一个字符串输入并将其打印在屏幕上。

int main (void)
{
    char* string;
    scanf("%s", string);
    printf("%s", string);
    return 0;
}

但输出是不可取的。

我提供了输入foo。节目打印出(null)。谁能解释为什么?

3 个答案:

答案 0 :(得分:5)

char* string;

这只是指向char的指针。它还没有指向任何记忆。您需要为要保留的字符分配内存。

您可以使用malloc()

分配内存
#include<stdio.h>
#include<stdlib.h>

int main(void){
    char *string;
    string = malloc(100); //string of length 100

    if(string == NULL){
        printf("Error\n");  //if malloc() fails
    }

    if((scanf("%99s", string)) != 1){ //if scanf() fails
        printf("Error, Fix it!\n");
        exit(1);
    }
    printf("%s\n",string);

    free(string);
    return 0;
}

或者,使用数组

#include<stdio.h>
#include<stdlib.h>

int main(void){
    char string[100];

    if((scanf("%99s", string)) != 1){
        printf("Error, Fix it!\n");
        exit(1);
    }
    printf("%s\n",string);

    return 0;
}

答案 1 :(得分:3)

您没有为string分配内存。因此,通过写入未启动的指针,您可以调用undefined behavior

在使用string之前,您必须使用malloc()或系列动态分配内存,或将string定义为数组,例如char srting[32]或其他内容。< / p>

另外,对于FWIW,最好用分配的内存来限制输入大小,比如

scanf("%31s", string);

在输入时间长于预期的情况下防止缓冲区溢出。

答案 2 :(得分:3)

scanf没有为string分配任何内存;你需要在调用函数之前自己做这件事。此外,您的程序行为未定义

一种简单的方法是重构为char string[100];,并且希望 scanf不会尝试读取超过99个字符加上空终止符。

稍后,你会意识到希望太多了,并且最终会编写你自己的I / O函数。