试图将指向 "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 */
我正在使用 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 */