我是C语言编程的新手,现在我正在研究字符串.我的问题是:如果我使用malloc(如下面的代码中)分配字符串,是否在字符串的末尾自动插入NULL字符?我在这里找到另一个问题的答案,似乎不会自动包含NULL字符.但是问题就出现了:我知道strlen如果没有NULL字符,那么函数就不起作用了,在这段代码中我使用它并且它有效.所以我认为\0在我的字符串的末尾,即使我不在任何地方写它.答案是什么?
这是代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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;
}
Run Code Online (Sandbox Code Playgroud)
Roa*_*ner 11
malloc()返回void*指向存储在堆中的内存块的指针.分配malloc()不会初始化任何字符串,只会占用等待占用的空间.要添加一个空终止字符,您必须自己执行此操作,或使用类似的函数scanf(),为您添加此字符.说完这个,你需要\0事先为这个角色分配空间.
你的malloc()电话应该是这样的:
stringa1 = (char*) malloc((n+1)*sizeof(char)); /*+1 for '\0' character */
Run Code Online (Sandbox Code Playgroud)
注意:您不需要转换malloc的返回.有关更多信息,请阅读此内容.
需要指出的另一点sizeof(char)是1,所以在你的malloc()通话中乘以这个是没有必要的.
您还需要检查是否malloc()返回NULL.这可以这样做:
if (stringa1 == NULL) {
/* handle exit */
Run Code Online (Sandbox Code Playgroud)
此外,您只能使用strlen()以null结尾的字符串,否则最终会导致未定义的行为.
一旦scanf()被调用,并且stringa1包含一些字符,你可以调用strlen()它.
此外,检查返回scanf()也是一个好主意.你可以这样检查:
if (scanf("%d", &n) != 1) {
/* handle exit */
Run Code Online (Sandbox Code Playgroud)
您的代码包含以下更改:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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;
}
Run Code Online (Sandbox Code Playgroud)
如果我使用malloc分配一个字符串(如下面的代码所示),是否在字符串末尾自动插入NULL字符?
否.malloc()返回一块未初始化的内存.
我知道如果没有NULL字符,'strlen'之类的函数不起作用,并且在这段代码中我使用它并且它有效.所以我认为在我的字符串末尾有'\ 0',即使我没有在任何地方写它.
scanf()'\0'当您使用%s格式说明符(假设scanf()成功)时,为您插入空字节().
来自man scanf():
s匹配一系列非空白字符; 下一个指针必须是指向字符数组的初始元素的指针,该字符数组的长度足以保存输入序列和终止空字节('\ 0'),该字节是自动添加的.输入字符串在空白处或最大字段宽度处停止,以先发生者为准.
(强调我的).
顺便说一下,你应该做错误检查scanf()和malloc()调用.
| 归档时间: |
|
| 查看次数: |
38802 次 |
| 最近记录: |