1

我在尝试将 char 复制到 char 时遇到了一些麻烦...

这是 args[] 定义:

char* args[6];
if (1 == ParseQuery(request, &args[0])) ....

#note : args[ARG_DATE] = "201204090600"

这是 d 定义:

struct date {
  char a[4];
  char m[2];
  char j[2];
  char h[4];
};

date d;

这就是我想要做的:

int TileServe::ParseQuery(FastCGIRequest& request, char** args) {

for (int i=0; i<4; i++) {
  d.a[i] = args[ARG_DATE][i];
  d.h[i] = args[ARG_DATE][i+8];
}
for (int i=0; i<2; i++) {
  d.m[i] = args[ARG_DATE][i+4];
  d.j[i] = args[ARG_DATE][i+6];
}

strcat(filename, "/");
strcat(filename, d.a);
strcat(filename, "/");
strcat(filename, d.m);
...
printf("%s\n", filename);

我得到:

./data/alpes/201204090600/04090600/090600/0600/alpes_201204090600.nc

我期待着 :

./data/alpes/2012/04/09/06/alpes_201204090600.nc

我究竟做错了什么 ?

4

2 回答 2

7

大多数 C 函数都需要以 null 结尾的字符串。您的子字符串 (da, dm, ...) 不是以空值结尾的。因此strcat,将所有内容追加到它在您的子字符串之后在内存中找到的第一个空字符。

一种解决方法是将 char 数组加长 1 并将'\0'字符放在子字符串的末尾。

另一个解决方法是使用strncat而不是strcat附加指定数量的字符。

于 2012-04-09T17:15:55.177 回答
2

尝试类似:

strncat(filename, "/", 1);
strncat(filename, d.a, 4);
strncat(filename, "/", 1);
strncat(filename, d.m, 2);
...

另外, -NUL终止你的字符串。

于 2012-04-09T17:17:48.310 回答