为什么将整数添加到字符串时,打印时不会显示该整数?这是代码:
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'
。
而且,尽管我们列出了许多问题,但变量backedUpPtr
和backedupPtr
(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 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;
}