[英]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)
是您要寻找的原因。
您需要一个有效的C字符串(它具有一个以零结尾的字符)。 所以加
*c = '\\0'; // at the end
您正在用'B'
覆盖'A'
'B'
。 如果您需要字符串"AB"
,请执行以下操作:
*c++ = 'A';
*c++ = 'B';
您已经增加了c
,所以它不再指向字符串的开头。 保存指向最开始的指针:
char* str = c;
// Now modify c
printf("%s", str);
您正在将'%s'
传递给printf
,这是错误的。 您需要传递一个字符串 ( "%s"
)。 参见#3。
正如@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个问题:
保留3个空格(不是2个)来容纳2个字符。
最后添加\\0
以终止char *
。
就像@PauloBu所说的那样, *c++ = 'B'
只增加指针而不增加您要设置的地址,您应该改用*(c+1)
。
使用"%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.