繁体   English   中英

C字符*分配

[英]C char * assigning

我开始学习C,我想创建一个字符串。 我正在使用的示例以这种方式执行此操作:

char *c = malloc(2 * sizeof(char)); // 2

*c = 'A';
*c++ = 'B';

printf('%s', c); //doesn't print anything?

所以我的问题是,如何打印字符串AB?

通过这样做: *c++ = 'B'; 您增加了指针。 这就是为什么printf不会打印任何内容的原因。

C和C ++中的字符串必须以零字节( \\x00 )结尾。 printf依靠它来正常工作。 正确的方法(关于您的代码)将是:

char *c = malloc(3 * sizeof(char)); // 2

*c = 'A';
*(c+1) = 'B';
*(c+2) = 0

printf("%s", c);

这绝不是有效的。 通常我们这样声明文字字符串:

char *c = "ab";

如果您想很好地了解指针的工作方式。 那么您的方法是一个很好的练习。 只需了解一元++运算符就可以将要应用的变量递增,因此,在应用它之后, c指针将不再指向字符串的开头。 这就是*(c+1)是您要寻找的原因。

  1. 您需要一个有效的C字符串(它具有一个以零结尾的字符)。 所以加

    *c = '\\0'; // at the end

  2. 您正在用'B'覆盖'A' 'B' 如果您需要字符串"AB" ,请执行以下操作:

    *c++ = 'A';
    *c++ = 'B';

  3. 您已经增加了c ,所以它不再指向字符串的开头。 保存指向最开始的指针:

    char* str = c;
    // Now modify c
    printf("%s", str);

  4. 您正在将'%s'传递给printf ,这是错误的。 您需要传递一个字符串"%s" )。 参见#3。

  5. 正如@sharth指出的(我想念的那样),您也只为2个char分配了空间,但是如果您想要字符串"AB" ,则需要3个char的空间(一个为'A' ,一个为'B' ,一个代表'\\0' )。

放在一起,看起来像:

char* c = malloc(3); // sizeof(char) is always 1
char* str = c; // Save a pointer to the start of the string

*c++ = 'A';
*c++ = 'B';
*c = '\0';

printf("%s", str);

free(str); // Don't forget to free what you malloc

首先,您必须记住一些在C中使用字符串时非常重要的事情,它们以NULL字符'\\ 0'终止,因此在动态创建字符串时请务必为其留出空间。

char *c = malloc(3 * sizeof(*c)); // You want to create the string AB so make room for 3
c[0] = 'A';
c[1] = 'B';
c[2] = '\0'; // Terminate the string with the \0 character 
char *c = malloc(3);
strcpy(c, "AB");
printf("%s", c);

您需要修复4个问题:

  1. 保留3个空格(不是2个)来容纳2个字符。

  2. 最后添加\\0以终止char *

  3. 就像@PauloBu所说的那样, *c++ = 'B'只增加指针而不增加您要设置的地址,您应该改用*(c+1)

  4. 使用"%s"来打印char *而不是'%s'

总之,您的代码需要更改为

char *c = (char *) malloc(3 * sizeof(char)); // 3

*c = 'A';
*(c+1) = 'B';
*(c+2) = '\0';

printf("%s", c);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM