试图将指向 "QUERY_STRING" 的 char 指针复制到 char[] 变量,得到错误的结果

Trying to copy char pointer to "QUERY_STRING" to a char[] variable, getting wrong result

我正在使用 FastCgi,试图生成动态 html 网页。

我能够很容易地获得 QUERY_STRING,但是我在尝试将其复制到字符数组中时遇到了问题。

如果有更短的方法从 QUERY_STRING 获取值,请指教,因为我有点不知所措。

char *queryString = getenv(ENV_VARS[7]);
char newDeviceName[64];

strncpy( newDeviceName, *queryString, sizeof(*queryString) -1);
printf("------- %c ------------", newDeviceName);

编译时只有警告,但是当我尝试加载网页时,这些字符是一些看起来很奇怪的中文字符。 -> �ፙ�

提前致谢。


编辑:我的更多代码

const char *ENV_VARS[] = {
    "DOCUMENT_ROOT",
    "HTTP_COOKIE",
    "HTTP_HOST",
    "HTTP_REFERER",
    "HTTP_USER_AGENT",
    "HTTPS",
    "PATH",
    "QUERY_STRING",
    "REMOTE_ADDR",
    "REMOTE_HOST",
    "REMOTE_PORT",
    "REMOTE_USER",
    "REQUEST_METHOD",
    "REQUEST_URI",
    "SCRIPT_FILENAME",
    "SCRIPT_NAME",
    "SERVER_ADMIN",
    "SERVER_NAME",
    "SERVER_PORT",
    "SERVER_SOFTWARE"
};

int main(void)
{
    char deviceName[]=ADAPTERNAME;
    time_t t;
    /* Intializes random number generator */
    srand((unsigned) time(&t));

    while (FCGI_Accept() >= 0) {

        printf("Content-type: text/html \r\n\r\n");
        printf("");
        printf("<html>\n");
        printf("<script src=\"/js/scripts.js\"></script>");

        /* CODE CODE CODE */

        printf("<p> hi </p>");
        printf("<p> hi </p>");
        char *queryString = getenv(ENV_VARS[7]);
        char newDeviceName[64];
        if (queryString == NULL)
            printf("<p> +++++ERROR++++++ </p>");
        else {
            strcpy( newDeviceName, queryString);
            newDeviceName[sizeof(newDeviceName) - 1] = 0;
            printf("<p> ------- %s ------------ </p> ", newDeviceName);
} 

已解决:业余错误,出于某种原因 none 我的新编辑在我重新启动我的 lighttpd 服务器后才生效。

strncpy上的长度错误[太短],第二个参数错误,格式字符串不正确。

试试这个:

strncpy( newDeviceName, queryString, sizeof(newDeviceName) - 1);
newDeviceName[sizeof(newDeviceName) - 1] = 0;
printf("------- %s ------------", newDeviceName);

在对 strncpy 的调用中,它期望第二个参数为 char *,但您将其传递给 char

此外,尺寸不正确。 *queryString 是一个 char 并且大小为 1。使用 sizeof(queryString) 也不正确,因为它将 return 指针的大小。你真正想要的是目标缓冲区的大小。

printf 调用中,%c 格式说明符需要 char,但您将其传递给 char *。您应该改用 %s,它期望 char * 指向空终止字符串。

那么你想要做的是:

strncpy( newDeviceName, queryString, sizeof(newDeviceName) -1);
newDeviceName[sizeof(newDeviceName) - 1] = 0;
printf("------- %s ------------", newDeviceName);

你想要的是

strncpy(newDeviceName, queryString, sizeof(newDeviceName)-1);
newDeviceName[63] = '[=10=]'; // Guarantee NUL terminator
printf("----- %s -----", newDeviceName);

这么多问题:

  • *queryString 只为您提供第一个字符,strncpy 试图将其视为指针。
  • sizeof(*queryString) 是一个字符的大小(即 1)
  • %c 打印单个字符,而不是字符串

您的程序有未定义的行为。 阅读编译器发出的那些警告。它们很重要。


在将字符串传递给 strncpy() 时不要取消引用指针。当你这样做时,你现在传递了一个 char。当它被提供给 strncpy() 时,它被转换为一个指针(这可能是您收到警告的地方,即将 char 传递给需要 char* 的函数)。

您也无法使用 sizeof 获取已衰减为指针的数组的大小。您只是获取指针的大小(可能是 8 或 4 个字节,具体取决于您的系统)。由于无论如何您都不知道字符串的长度,因此最好只使用 strcpy() 而不是 strncpy().


您的代码可能如下所示:

char *queryString = getenv(ENV_VARS[7]);
char newDeviceName[64];

strcpy( newDeviceName, queryString);
printf("------- %s ------------", newDeviceName); /* use %s to print strings */