c-使用malloc分配字符串



我是C语言编程的新手,现在我正在学习字符串。我的问题是:如果我使用malloc分配字符串(如下面的代码所示),NULL字符是否会自动插入字符串的末尾?我在这里的另一个问题中找到了答案,并且似乎没有自动包含NULL字符。但问题来了:我知道,如果没有NULL字符,像strlen这样的函数就不起作用,在这段代码中,我使用了它,它起作用了。所以我认为在我的字符串末尾有,即使我不在任何地方写它。答案是什么?

这是代码:

#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;
}

malloc()返回一个指向堆中存储的内存块的void*指针。使用malloc()进行分配不会初始化任何字符串,只有等待占用的空间。要添加一个null终止字符,您必须自己完成,或者使用类似scanf()的函数为您添加该字符。话虽如此,您需要事先为这个字符分配空间。

您的malloc()呼叫应该是这样的:

stringa1 = (char*) malloc((n+1)*sizeof(char)); /*+1 for '' character */

注意:您不需要铸造malloc的return。欲了解更多信息,请阅读本文。

需要指出的另一件事是sizeof(char)1,因此不需要在malloc()调用中乘以它。

您还需要检查malloc()是否返回NULL。可以这样做:

if (stringa1 == NULL) {
/* handle exit */

此外,您只能在以null结尾的字符串上使用strlen(),否则这将是未定义的行为。

一旦调用了scanf(),并且stringa1包含一些字符,就可以在上面调用strlen()

此外,检查scanf()的返回也是一个好主意。你可以这样检查:

if (scanf("%d", &n) != 1) {
/* handle exit */

您的代码有这些更改:

#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 inputn");
exit(EXIT_FAILURE);
}
stringa1 = malloc(n+1);
if (stringa1 == NULL) {
printf("Cannot allocate %zu bytes for stringn", n+1);
exit(EXIT_FAILURE);
}
printf("Insert the string: ");
scanf("%s", stringa1);
slen = strlen(stringa1);
printf("String: %s Length: %zun", stringa1, slen);
free(stringa1);
stringa1 = NULL;
return 0;
}

如果我使用malloc分配字符串(如下面的代码所示),NULL字符是否会自动插入字符串末尾?

否。CCD_ 20返回一个未初始化的内存块。

我知道如果没有NULL字符,像"strlen"这样的函数就不起作用,在这段代码中我使用了它,它起作用了。所以我认为字符串的末尾有"\0",即使我没有在任何地方写它。

scanf()在使用%s格式说明符时为您插入空字节('')(假设scanf()成功)。

来自man scanf():

s匹配非空白字符序列;下一个指针必须是指向长度足以容纳输入序列的字符数组和终止的空字节('\0')自动输入字符串在空白处或最大字段宽度,以先出现的为准。

(强调矿)。

顺便说一下,您应该对scanf()malloc()调用进行错误检查。

malloc返回指向未初始化内存区的指针。

如果希望内存区由零初始化,则可以使用另一个标准函数calloc而不是malloc

考虑到通常像这样的问题

printf("How many characters in the string? ");

意味着终止的零不被计算在内。因此,您必须再分配一个字节的内存。例如

stringa1 = ( char* )malloc( ( n + 1 ) *sizeof( char ) );

stringa1 = ( char* )calloc( n + 1, sizeof( char ) );

在最后一种情况下,您可以应用函数strlen,该函数返回0,因为内存范围已初始化为零。

本次调用scanf

scanf("%s", stringa1);

不安全。最好使用fgets。例如

fgets( stringa1, n + 1, stdin );

此函数可以在字符串中添加换行符。要将其从字符串中删除,可以编写

stringa1[strcspn( stringa1, "n" )] = '';

C中"字符串"的定义是一个字符序列,以null字符结束

要为字符串分配内存,请计算chracters(例如strlen),并为该终止空字符加1。

scanfstrcpy这样的函数添加了空字符;像CCD_ 37这样的函数并不总是这样。

实现这一点的简单方法是包含cs50库。只需使用get_string函数:

#include <stdio.h>
#include <cs50.h>
int main(void) {
// input the string to stringa1
char *stringa1 = get_string("Insert the string: ");
// call the string
printf("The string you type was: %sn", stringa1);
return 0;
}

样本输出:插入字符串:你好,世界,我是新手!你输入的字符串是:你好,世界,我是新手!

相关内容

  • 没有找到相关文章