尝试将char指针复制到“QUERY_STRING”到char []变量,得到错误的结果

时间:2016-07-12 19:29:20

标签: html c fastcgi

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

我能够轻松地获得QUERY_STRING,但是我在尝试将其复制到char数组时遇到了麻烦。

如果从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);
} 

解决:业余错误,由于某种原因,直到我重新启动lighttpd服务器之后,我的所有新编辑都没有生效。

4 个答案:

答案 0 :(得分:0)

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

试试这个:

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

答案 1 :(得分:0)

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

此外,尺寸不正确。 *queryStringchar,大小为1.使用sizeof(queryString)不正确,因为它会返回指针的大小。你真正想要的是去除缓冲区的大小。

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] = '\0'; // Guarantee NUL terminator
printf("----- %s -----", newDeviceName);

答案 2 :(得分:0)

你想要的是

*queryString

所以有多个问题:

  • strncpy只会获得第一个字符,sizeof(*queryString)会尝试将其视为指针。
  • %c是字符的大小(即1)
  • SELECT NAME, CASE WHEN AGE >=18 AND SEX='M' THEN 'Adult Male' WHEN AGE>18 AND SEX='M' 'Non-Adult Male' WHEN AGE >=18 AND SEX='F' THEN 'Adult Female' WHEN AGE<18 AND TITLE='F' THEN 'Non-Adult Female' ELSE NULL END AS AGE_SEX, ADDRESS, SALARY FROM PERSONALS; 打印单个字符,而不是字符串

答案 3 :(得分:0)

您的程序有未定义的行为。 阅读编译器发出的警告。他们非常重要。

当您将字符串传递给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 */