3

我是 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

4 回答 4

4

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

于 2013-09-21T20:58:19.887 回答
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
于 2013-09-21T21:08:41.237 回答
1

strncpyn 个字符从第二个参数复制到第一个...空终止符也是!...那么您将尝试在fputs()等其他函数中使用fileReqName时得到一些不可预测的结果。你需要尝试:

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

但它和strcpy一样......

于 2013-09-21T22:57:51.043 回答
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 应该做什么。

于 2013-09-21T23:59:34.697 回答