我是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()
调用.
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; }
如果我使用malloc分配一个字符串(如下面的代码所示),是否在字符串末尾自动插入NULL字符?
否.malloc()
返回一块未初始化的内存.
我知道如果没有NULL字符,'strlen'之类的函数不起作用,并且在这段代码中我使用它并且它有效.所以我认为在我的字符串末尾有'\ 0',即使我没有在任何地方写它.
scanf()
'\0'
当您使用%s
格式说明符(假设scanf()
成功)时,为您插入空字节().
来自man scanf()
:
s匹配一系列非空白字符; 下一个指针必须是指向字符数组的初始元素的指针,该字符数组的长度足以保存输入序列和终止空字节('\ 0'),该字节是自动添加的.输入字符串在空白处或最大字段宽度处停止,以先发生者为准.
(强调我的).
顺便说一下,你应该做错误检查scanf()
和malloc()
调用.