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

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'

而且,尽管我们列出了许多问题,但变量backedUpPtrbackedupPtru的大写字母)之间存在巨大差异,这是释放分配的内存的好方法,并且不应在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 available\n");
        return 1;
    }
    backedUpPtr = newStr;

    *newStr = 'a';               // store the a
    newStr++;
    *newStr = '4';               // store the character 4
    newStr++;
    *newStr = '\0';              // 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 available\n");
        return 1;
    }

    *newStr++ = 'a';
    *newStr++ = '4';
    *newStr   = '\0';

    printf("%s", backedUpPtr);

    free (backedUpPtr);

    return 0;
}


或者,因为四个字节是一个很小的数目,所以根本不需要使用malloc(除了可能对动态内存分配有所了解之外):

#include <stdio.h>

int main (void) {
    char backedUpPtr[4], *newStr = backedUpPtr;

    *newStr++ = 'a';
    *newStr++ = '4';
    *newStr = '\0';

    printf("%s", backedUpPtr);

    return 0;
}


或者,甚至更简单,尽管还不如教育:-)

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

07-25 23:33
查看更多