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、...)はnullで終了しません。したがってstrcat、サブストリングの後にメモリ内で最初に見つかったヌル文字までのすべてを追加しています。

1つの修正は、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 に答える