我是C语言的新手,虽然我听说它和C++非常相似,因为C++是C语言的一个附加组件。
我似乎无法在方法中设置全局变量(空字符串),然后将其打印到文本文件中。
我尝试过一些事情,但是基于一些似乎有意义的事情,并且在我的程序的其他部分对我有效。我就在这里:
char fileReqName[1024] = "";//trying to create the global variable
//code lines and methods
//theres a pointer that point's to a "token" thats a string.. called pptr
strncpy(fileReqName, pptr, sizeof(pptr));
//in another method:
fputs(fileReqName,file_ptr);
但没用。
它应该是从浏览器请求中获取“文件名”。有时它会将浏览器要访问的文件名剪切成一个较小的字符串,有时它不会显示任何内容。这可能是令牌的问题,但当我之前显示它时,令牌总是正确的。
我也试过:
strcpy(fileReqName, pptr);
好像有时候也管用哈。我想我可能需要检查其他代码,看看为什么它没有显示正确的字符串/路径?
有什么建议吗?谢谢
最佳答案
我不同意3个张贴的答案,并提交另一个解决方案。n
参数的主要用途是确保目标s1
不会溢出。
// prototype
#include <string.h>
char *strncpy(char * restrict s1, const char * restrict s2, size_t n);
// Recommended usage for OP
char fileReqName[1024];
fileReqName[sizeof(fileReqName) - 1] = '\0';
...
strncpy(fileReqName, pptr, sizeof(fileReqName) - 1);
这将执行通常的
strcpy()
功能,并增加2个预防功能。1即使
strlen(pptr)
等于或大于1023,也只写入前1023,防止缓冲区覆盖。2如果出现1,
\0
赋值将确保fileReqName
以a\0
结束。第一种解决方案建议
strlen(pptr)
。这会产生各种各样的问题,因为\0
字节未复制到fileReqName
,使其可能未终止。它不能防止超支。strncpy(fileReqName, pptr, (strlen(pptr) + 1))
的问题是它不能防止fileReqName
中的缓冲区溢出。真的和strcpy(fileReqName, pptr)
没什么不同。printf()
解决方案很好地描述了op的试用解决方案中的问题,但是没有提供op应该做什么。