C 将变量连接到另一个变量上

C 将变量连接到另一个变量上,c,C,我不明白为什么会出现以下错误: 错误:字符串常量之前应为“') 基本上,我只想将变量SITE\u名称连接到SITE\u根上。错误在sprintf行上。有什么想法吗 更新:因此,如果代码在main()内,则代码可以工作。我把它放在main()之外,这样我就可以在函数内部使用这些变量 错误看起来可能没有显示在代码中,但是sprintf应该是: const char *SITE_NAME = "test"; char SITE_ROOT[19]; sprintf (SITE_ROOT, "/var/w

我不明白为什么会出现以下错误:

错误:字符串常量之前应为“')

基本上,我只想将变量SITE\u名称连接到SITE\u根上。错误在sprintf行上。有什么想法吗


更新:因此,如果代码在main()内,则代码可以工作。我把它放在main()之外,这样我就可以在函数内部使用这些变量

错误看起来可能没有显示在代码中,但是
sprintf
应该是:

const char *SITE_NAME = "test";
char SITE_ROOT[19];
sprintf (SITE_ROOT, "/var/www/html/%s", SITE_NAME);
编辑:

以下是我的完整测试代码(如果有帮助的话):

sprintf (SITE_ROOT, "/var/www/html/%s", SITE_NAME);
#包括
#包括
int main()
{
const char*SITE_NAME=“test”;
char SITE_ROOT[19];
sprintf(SITE_ROOT,“/var/www/html/%s”,SITE_NAME);
printf(“%s\n”,站点\u根);
返回0;
}

由于这是一个非常简单的例子,您可以简单地初始化字符串,然后连接到它上。您可能希望添加检查,以确保不会超出字符串的边界

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

int main()
{
    const char *SITE_NAME = "test";
    char SITE_ROOT[19];
    sprintf (SITE_ROOT, "/var/www/html/%s", SITE_NAME);

    printf( "%s\n", SITE_ROOT ) ;

    return 0 ;
}

正如已经指出的,直接的问题是您试图从函数外部调用
sprintf

您提到这样设置字符串是因为除了将其与路径连接起来之外,您还单独使用了
SITE\u NAME
,并且您只需要在一个地方更改它。这是一个很好的目标,在一些圈子里被称为。但是,即使代码起作用(比如,因为您将
sprintf
调用移到main中),由于以下原因,您也没有真正实现目标:

strcpy(SITE_ROOT, "/var/www/html/"); 
strcat(SITE_ROOT, SITE_NAME);
您正在声明一个固定长度的数组,其大小正好足以容纳
“/var/www/html/test”
,这只是要求缓冲区溢出。当您将
SITE\u NAME
“test”
更改为例如
“someRealSiteName”
时,您很可能会在连接时覆盖其他内容,从而导致不可预知的结果。因此,每次更改
SITE\u NAME
时,都必须手动重新计算最终字符串的长度并更新数组大小(这很容易出错,比如忘记为空终止符添加1)

当然,您可以限制
SITE\u NAME
的长度和大小
SITE\u ROOT
以保持尽可能长的路径,但这是一个人为的限制,最终可能会浪费空间。此外,您还必须验证在运行时没有超过长度(或者使用忽略额外字符的函数)

相反,您可以动态设置
SITE\u ROOT的大小,如下所示:

char SITE_ROOT[19];

哪一行给了你错误?@JackManey-我已经更新了我的帖子…错误在sprintf行。一个意外的宏可能会把事情搞砸。检查预处理器输出。(
cc-E file.c
适用于类unix编译器;如果需要更多帮助,请告诉您正在使用的编译器)您写道:“我在main()之外使用了它。”。。。这不是C的工作方式。请注意,您仍然可以将变量保留在任何函数之外并全局使用它们,问题在于
sprintf
调用。不过,我很好奇,为什么你要这样做,而不是
constcharsite_ROOT[]=“var/www/html/test”。通过将其拆分并立即进行连接,您到底想要实现什么?我已经在SITE_NAME前面去掉了符号,但它仍然给出了一个错误。我添加了符号,因为我认为SITE_NAME被定义为一个指针,要调用该指针,我需要添加一个符号,不?@user983223这很奇怪,我根本无法重现该错误。
%s
格式说明符需要一个c样式的字符串,它是
字符*
,这就是
站点名称
。我将用我完整的测试代码更新我的帖子,以防有帮助。@Shafik_Yaghmour-独立代码可以工作。我将分而治之,尝试找出哪个函数不喜欢它。@ShafikYaghmour-代码之所以有效,是因为变量是在main()中定义的。我将它们隐藏在main()之外,以便其他函数可以使用这些变量。@user983223啊,好的,这更有意义。您可以有全局变量,但不能在函数的
main
之外有类似sprintf的语句。如果要将
SITE\u ROOT
保留为固定长度的缓冲区(这似乎是您的意思),可以直接用
char SITE\u ROOT[19]=“var/www/html/”对其进行初始化
并跳过strcpy
调用。@user983223我很高兴您发现它很有用。我应该指出,字符串文字的合并不仅仅与宏一起工作,它恰好在那里最有用。因此,您可以使用
const char SITE\u ROOT[]=SITE\u PATH\u MACRO SITE\u NAME\u MACRO
删除一个宏,或者
const char SITE\u ROOT[]=“/var/www/html/”SITE\u NAME\u MACRO
删除两个宏(如果您不需要
SITE\u PATH
变量)
#include <stddef.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

const char SITE_PATH[] = "/var/www/html/";
const char SITE_NAME[] = "someRealSiteName";
char *SITE_ROOT = NULL; // just making this explicit, would be set to 0 anyway

int main(void)
{
    size_t siteRootLength = strlen(SITE_PATH) + strlen(SITE_NAME);

    SITE_ROOT = malloc(siteRootLength + 1); //don't forget to account for the terminating '\0'

    strcpy(SITE_ROOT, SITE_PATH);
    strcat(SITE_ROOT, SITE_NAME);

    printf("%s\n", SITE_NAME):
    printf("%s\n", SITE_PATH):
    printf("%s\n", SITE_ROOT):

    return 0;
}
#include <stdio.h>

#define SITE_PATH_MACRO "/var/www/html/"
#define SITE_NAME_MACRO "someRealSiteName"

// the preprocessor will merge the two string literals into one
#define SITE_ROOT_MACRO SITE_PATH_MACRO SITE_NAME_MACRO

// you could do without some or all of these if you don't need them
// (or are willing to use the macros directly)
const char SITE_PATH[] = SITE_PATH_MACRO;
const char SITE_NAME[] = SITE_NAME_MACRO;
const char SITE_ROOT[] = SITE_ROOT_MACRO;

int main(void)
{
    printf("%s\n", SITE_NAME);
    printf("%s\n", SITE_PATH);
    printf("%s\n", SITE_ROOT);

    return 0;
}