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

(null) is being printed while printing a string

我写了一个 C 程序,它接受用户输入的字符串并将其打印在屏幕上。

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

但输出结果不理想。

我输入了 foo。程序打印出来(null)。谁能解释为什么?

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;
}

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

在使用string之前,要么必须使用malloc()或family动态分配内存,要么将string定义为数组,如char srting[32]之类的.

此外,FWIW,最好通过分配的内存限制输入大小,例如

scanf("%31s", string);

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

scanf 没有为 string 分配任何内存;您需要在调用该函数之前自己执行此操作。否则你的程序行为是 undefined.

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

稍后,您会发现希望太高,最终会编写自己的 I/O 函数。