如何创建全局字符串变量,将其设置在某个位置,并将其输出到文件?

时间:2013-09-21 20:50:26

标签: c syntax

我是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);
哈哈,有时似乎也有效。我想我可能要检查其他代码为什么它没有显示正确的字符串/路径?

有什么建议吗?感谢

4 个答案:

答案 0 :(得分:4)

如果pptr是指针,sizeof(pptr)可能是4个字节。这会将4个字节复制到fileReqName。您需要复制字符串的长度,而不仅仅是sizeof(pptr)(类似strlen(pptr))。

答案 1 :(得分:2)

来自strncpy的手册页:

char * strncpy ( char * destination, const char * source, size_t num );

其中:

num
Maximum number of characters to be copied from source.
size_t is an unsigned integral type.

您使用sizeof(pptr)代替strlen(pptr)。看看这个简单的例子:

#include <stdio.h>

int main(void) {
  char * pptr = "this is a string literal";
  printf("pptr = '%s', sizeof(pptr) = %ld, strlen(pptr) = %d",
         pptr,sizeof(pptr),strlen(pptr));
}

输出:

pptr = 'this is a string literal', sizeof(pptr) = 8, strlen(pptr) = 24

答案 2 :(得分:1)

strncpy n 字符从第二个参数复制到第一个参数...如果第二个参数的长度超过 n ,没有复制空终止符...如果你执行 strlen(pptr)你得到的字符串的长度也没有空终结符!...那么你会得到一些不可预知的结果试图使用< strong> fileReqName 在其他函数中,例如 fputs()。你需要尝试:

strncpy(fileReqName, pptr, (strlen(pptr) + 1));

但它与 strcpy 相同......

答案 3 :(得分:0)

我不同意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\0结束。


第一个解决方案建议strlen(pptr)。这会产生各种问题,因为\0字节未复制到fileReqName,因此可能无法终止。它不会阻止超支。


strncpy(fileReqName, pptr, (strlen(pptr) + 1))的问题是不能阻止fileReqName中的缓冲区溢出。与strcpy(fileReqName, pptr)无异。


printf()解决方案很好地描述了OP试用解决方案中的问题,但没有提供OP应该做的事情。