我开始学习C,我想创建一个字符串。我正在使用的例子是这样做的:
char *c = malloc(2 * sizeof(char)); // 2
*c = 'A';
*c++ = 'B';
printf('%s', c); //doesn't print anything?
所以我的问题是,如何打印字符串AB?
答案 0 :(得分:11)
通过这样做:*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 :(得分:3)
您需要一个有效的C字符串(具有空终止字符)。所以添加
*c = '\0'; // at the end
您正在使用'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个空格{ {1}} s(一个用于char
,一个用于'A'
,另一个用于'B'
。
将它们放在一起,看起来像:
'\0'
答案 2 :(得分:2)
首先,你必须记住在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
答案 3 :(得分:0)
char *c = malloc(3);
strcpy(c, "AB");
printf("%s", c);
答案 4 :(得分:-1)
您需要解决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);