给定一个用malloc创建的字符串,如何给它添加一个整数



为什么当将整数添加到字符串时,打印它时不会显示?下面是代码:

char *newStr = NULL;
char *backedUpPtr = NULL;
newStr = (char *) malloc ((4) * sizeof(char));
backedUpPtr = newStr;
*newStr = 'a';
newStr++;
*newStr = 4;
printf("%s", backedupPtr);

打印这个时,数字4不会出现。为什么呢?我需要将其转换为字符吗?如果有,怎么做?

首先,您没有用NUL字符结束字符串(因此从技术上讲,它不是 C字符串)。从malloc返回的内存包含任意字节,不一定是零。

换句话说,这段代码可能会给你带来麻烦,因为你没有正确地终止字符串——printf可能会因此崩溃成一个尖叫的堆。

在此之上,您正在存储代码点4,这是ASCII中的CTRL-D。如果你想要一个可打印的 4,你需要使用'4'

而且,虽然我们列出了一长串的问题,但变量backedUpPtrbackedupPtr之间存在巨大差异(即u的资本化),释放分配的内存是很好的形式,并且您不应该在C中转换malloc的返回值,它可能导致某些微妙的错误。此外,乘以sizeof(char)是不必要的,因为它总是 1。

底线,我将从这段代码开始,然后从那里继续:

#include <stdio.h>
#include <stdlib.h>
int main (void) {
    char *newStr = NULL;
    char *backedUpPtr = NULL;
    newStr = malloc (4);         // no need for cast or multiply
    if (newStr == NULL) {        // and ALWAYS check
        printf ("No memory availablen");
        return 1;
    }
    backedUpPtr = newStr;
    *newStr = 'a';               // store the a
    newStr++;
    *newStr = '4';               // store the character 4
    newStr++;
    *newStr = '';              // make into C string
    printf ("%s", backedUpPtr);
    free (backedUpPtr);          // also good form
    return 0;
}

,尽管它可以写得更简单:

#include <stdio.h>
#include <stdlib.h>
int main (void) {
    char *newStr = malloc (4);
    char *backedUpPtr = newStr;
    if (newStr == NULL) {
        printf ("No memory availablen");
        return 1;
    }
    *newStr++ = 'a';
    *newStr++ = '4';
    *newStr   = '';
    printf("%s", backedUpPtr);
    free (backedUpPtr);
    return 0;
}

或者,因为四个字节是相当小的数量,所以根本没有真正需要使用malloc(除了可能教你如何动态内存分配):

#include <stdio.h>
int main (void) {
    char backedUpPtr[4], *newStr = backedUpPtr;
    *newStr++ = 'a';
    *newStr++ = '4';
    *newStr = '';
    printf("%s", backedUpPtr);
    return 0;
}

或者,更简单一点,虽然不那么有教育意义:-)

#include <stdio.h>
int main (void) {
    printf ("a4");
    return 0;
}

相关内容

  • 没有找到相关文章

最新更新