我正在使用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服务器之后,我的所有新编辑都没有生效。
答案 0 :(得分:0)
strncpy
上的长度错误[太短],第二个参数错误,格式字符串不正确。
试试这个:
strncpy( newDeviceName, queryString, sizeof(newDeviceName) - 1);
newDeviceName[sizeof(newDeviceName) - 1] = 0;
printf("------- %s ------------", newDeviceName);
答案 1 :(得分:0)
在对strncpy
的调用中,它希望第二个参数为char *
,但您传递char
。
此外,尺寸不正确。 *queryString
是char
,大小为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 */