0

我还是新来的,但我遇到了质疑,为什么我认为以下内容无法完成。

我正在尝试将 foobar 分配给“Hello there!\n”的值。要么无法完成,要么我很难弄清楚。

编辑:我需要澄清一下,我正在寻找以下原因不起作用的原因,而不是可以取代它的众多解决方案中的 1 个。

编辑:我接受了“你不能以这种方式连接 c 中的字符串变量”的答案。大概是因为编写解析器太难而无法采用以下方式。我太新了,不知道有什么不同,也太新了,不能这么担心。如果有人发现引用的正式原因,请张贴。

#include <stdio.h>

int main()
{

char *foo = "Hello";
char *bar = " there!\n";
const char *foobar = (*foo) *bar;

printf("%s", foobar);

return 0;

}

这似乎不应该是一个问题。

4

4 回答 4

11

您不能以这种方式连接 c 中的字符串变量。

您需要一个内存空间,您可以在其中复制该内存中的两个字符串。

内存空间可以是静态缓冲区,就像char foobar[100]您已经知道字符串的大小不能大于定义的大小一样。或者,如果您不知道字符串的限制大小,如以下示例所示,内存可能是动态缓冲区

#include <stdio.h>
#include <string.h>

int main()
{

   char *foo = "Hello";
   char *bar = " there!\n";
   char *foobar = malloc(strlen(foo) + strlen(bar) + 1);
   strcpy(foobar,foo);
   strcat(foobar,bar);
   printf("%s", foobar);

   return 0;

}

如果您分配内存,malloc()那么不要忘记foobar在您的程序中变得无用时释放内存

free(foobar);
于 2013-01-12T20:30:18.490 回答
3

在 C 中,字符串不能以您的方式连接。模仿您正在尝试做的事情的一种可能方法是使用预处理器:

#include <stdio.h>
#define FOO "foo"
#define BAR "bar"

int main()
{
char *foo = FOO;
char *bar = BAR;
const char *foobar = FOO BAR;

printf("%s", foobar);

return 0;
}
于 2013-01-12T20:34:46.467 回答
2

回答“已编辑”的问题:

它不起作用,因为 C 语言本身不知道如何连接字符串。您应该使用strcat或其他一些功能。此外,编译器不知道将字符串放在内存中的何处,因为它不能使用“foo”和“bar”的存储空间来存储结果字符串。

当然,在C语言中,*foo你代码中的意思是字母'H'*bar变成了' '。So(*foo) *bar变得('H') ' '在C中绝对没有用处。

于 2013-01-12T20:43:26.347 回答
1

您的代码可能编译没有问题,但其中可能存在一些错误。

前两个 char*(或字符串)声明是合法的。第三个没那么多。您将 (*bar) 转换为 *foo,它不是数据类型而是变量,并且您将 foobar 设置为 foo 的转换值,而不是进行字符串连接。

C 不使用运算符进行字符串连接。相反,您需要使用特定的库来连接字符串或创建自己的函数。对于字符串,您有string.h

对于这种特殊情况,您有strcat:它接受两个字符串并返回一个包含这两个字符串连接的新字符串。

因此,对于您的示例:

char *foo = "Hello";
char *bar = " there!\n";
const char *foobar = malloc((strlen(foo)+strlen(bar))*sizeof(char));
foobar = strcat(foo,bar);

像这样的东西。

希望这可以帮助。

于 2013-01-12T20:45:24.457 回答