当前位置:  开发笔记 > 编程语言 > 正文

使用malloc分配字符串

如何解决《使用malloc分配字符串》经验,为你挑选了2个好方法。

我是C语言编程的新手,现在我正在研究字符串.我的问题是:如果我使用malloc(如下面的代码中)分配字符串,是否在字符串的末尾自动插入NULL字符?我在这里找到另一个问题的答案,似乎不会自动包含NULL字符.但是问题就出现了:我知道strlen如果没有NULL字符,那么函数就不起作用了,在这段代码中我使用它并且它有效.所以我认为\0在我的字符串的末尾,即使我不在任何地方写它.答案是什么?

这是代码:

#include 
#include 
#include 

int main(int argc, char** argv) {
    char *stringa1;
    int n;
    int i;

    printf("How many characters in the string? ");
    scanf("%d", &n);

    stringa1 = (char*) malloc(n*sizeof(char));

    printf("Insert the string: ");
    scanf("%s", stringa1);

    free(stringa1);

    return 0;
}

RoadRunner.. 11

malloc()返回void*指向存储在堆中的内存块的指针.分配malloc()不会初始化任何字符串,只会占用等待占用的空间.要添加一个空终止字符,您必须自己执行此操作,或使用类似的函数scanf(),为您添加此字符.说完这个,你需要\0事先为这个角色分配空间.

你的malloc()电话应该是这样的:

stringa1 = (char*) malloc((n+1)*sizeof(char)); /*+1 for '\0' character */

注意:您不需要转换malloc的返回.有关更多信息,请阅读此内容.

需要指出的另一点sizeof(char)1,所以在你的malloc()通话中乘以这个是没有必要的.

您还需要检查是否malloc()返回NULL.这可以这样做:

if (stringa1 == NULL) {
    /* handle exit */

此外,您只能使用strlen()以null结尾的字符串,否则最终会导致未定义的行为.

一旦scanf()被调用,并且stringa1包含一些字符,你可以调用strlen()它.

此外,检查返回scanf()也是一个好主意.你可以这样检查:

if (scanf("%d", &n) != 1) {
    /* handle exit */

您的代码包含以下更改:

#include 
#include 
#include 

int main(void) {
    char *stringa1 = NULL;
    size_t n, slen;

    printf("How many characters in the string? ");
    if (scanf("%zu", &n) != 1) {
        printf("Invalid input\n");
        exit(EXIT_FAILURE);
    }

    stringa1 = malloc(n+1);
    if (stringa1 == NULL) {
        printf("Cannot allocate %zu bytes for string\n", n+1);
        exit(EXIT_FAILURE);
    }

    printf("Insert the string: ");
    scanf("%s", stringa1);

    slen = strlen(stringa1);
    printf("String: %s Length: %zu\n", stringa1, slen);

    free(stringa1);
    stringa1 = NULL;

    return 0;
}


P.P... 8

如果我使用malloc分配一个字符串(如下面的代码所示),是否在字符串末尾自动插入NULL字符?

否.malloc()返回一块未初始化的内存.

我知道如果没有NULL字符,'strlen'之类的函数不起作用,并且在这段代码中我使用它并且它有效.所以我认为在我的字符串末尾有'\ 0',即使我没有在任何地方写它.

scanf()'\0'当您使用%s格式说明符(假设scanf()成功)时,为您插入空字节().

来自man scanf():

s匹配一系列非空白字符; 下一个指针必须是指向字符数组的初始元素的指针,该字符数组的长度足以保存输入序列和终止空字节('\ 0'),该字节是自动添加的.输入字符串在空白处或最大字段宽度处停止,以先发生者为准.

(强调我的).

顺便说一下,你应该做错误检查scanf()malloc()调用.



1> RoadRunner..:

malloc()返回void*指向存储在堆中的内存块的指针.分配malloc()不会初始化任何字符串,只会占用等待占用的空间.要添加一个空终止字符,您必须自己执行此操作,或使用类似的函数scanf(),为您添加此字符.说完这个,你需要\0事先为这个角色分配空间.

你的malloc()电话应该是这样的:

stringa1 = (char*) malloc((n+1)*sizeof(char)); /*+1 for '\0' character */

注意:您不需要转换malloc的返回.有关更多信息,请阅读此内容.

需要指出的另一点sizeof(char)1,所以在你的malloc()通话中乘以这个是没有必要的.

您还需要检查是否malloc()返回NULL.这可以这样做:

if (stringa1 == NULL) {
    /* handle exit */

此外,您只能使用strlen()以null结尾的字符串,否则最终会导致未定义的行为.

一旦scanf()被调用,并且stringa1包含一些字符,你可以调用strlen()它.

此外,检查返回scanf()也是一个好主意.你可以这样检查:

if (scanf("%d", &n) != 1) {
    /* handle exit */

您的代码包含以下更改:

#include 
#include 
#include 

int main(void) {
    char *stringa1 = NULL;
    size_t n, slen;

    printf("How many characters in the string? ");
    if (scanf("%zu", &n) != 1) {
        printf("Invalid input\n");
        exit(EXIT_FAILURE);
    }

    stringa1 = malloc(n+1);
    if (stringa1 == NULL) {
        printf("Cannot allocate %zu bytes for string\n", n+1);
        exit(EXIT_FAILURE);
    }

    printf("Insert the string: ");
    scanf("%s", stringa1);

    slen = strlen(stringa1);
    printf("String: %s Length: %zu\n", stringa1, slen);

    free(stringa1);
    stringa1 = NULL;

    return 0;
}



2> P.P...:

如果我使用malloc分配一个字符串(如下面的代码所示),是否在字符串末尾自动插入NULL字符?

否.malloc()返回一块未初始化的内存.

我知道如果没有NULL字符,'strlen'之类的函数不起作用,并且在这段代码中我使用它并且它有效.所以我认为在我的字符串末尾有'\ 0',即使我没有在任何地方写它.

scanf()'\0'当您使用%s格式说明符(假设scanf()成功)时,为您插入空字节().

来自man scanf():

s匹配一系列非空白字符; 下一个指针必须是指向字符数组的初始元素的指针,该字符数组的长度足以保存输入序列和终止空字节('\ 0'),该字节是自动添加的.输入字符串在空白处或最大字段宽度处停止,以先发生者为准.

(强调我的).

顺便说一下,你应该做错误检查scanf()malloc()调用.

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有