2012-04-09 58 views
1

我得到了一些麻煩試圖複製字符到char ...C++字符數組:A [1] = B [I]失敗

這裏是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 

我在做什麼錯?

回答

7

大多數C函數都期望以空字符結尾的字符串。您的子字符串(d.a,d.m,...)不以空字符結尾。因此,strcat正在將所有內容都追加到子字符串之後在內存中找到的第一個空字符。

一種修復方法是將char數組加一,並將'\0'字符放在子字符串的末尾。

另一個修復方法是使用strncat而不是strcat來追加指定數量的字符。

+0

+1你的速度更快。 – karlphillip 2012-04-09 17:19:00

+0

@ user1219721:'''\ 0''不是'「\ 0」' - 但是,這是一個解決方案。 – 2012-04-09 17:47:12

2

試着這麼做:

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

此外,NUL -terminate你的字符串。

相關問題