2012-06-14 22 views
1

我得到2個數組:試圖分裂一個字符串轉換部件

data[256] = "[email protected]@[email protected]@5" 
question[256][256]; 

我需要將@之前數目分成數組.. 例如:

question[0][] = 1 
question[1][] = 2 
question[2][] = 3 
question[3][] = 4 
question[4][] = 5 

它不梅特如果我有@,或沒有。

這是我寫的:

int i = 0, j = 0; 
data = "[email protected]@[email protected]@5"; 

for (i = 0 ; i < strlen(data) ; i++) 
{ 
    for (j ; data[j] != '@' ; j++) 
    { 
     question[i][j] = data[j]; 
    } 
    j++ 
} 

printf ("%s\n", question); 

的問題是,它的工作原理,直到第一@,然後停止。 它只會把第一個@置疑,然後停止。 (basiclly我應該得到相同的輸出打印數據和問題)。

+0

'question'不是字符串,所以你不能用'%s'的printf它。 –

+0

由於它是作業,我猜你不能使用像'strchr'或類似的內置函數? –

+0

另外,在開始之前有沒有什麼問題,或者是否清除了其內容? –

回答

2

有幾個問題。

首先,printf只打印字符串,直到第一終止零字符('\0'),這在question(即使有其他地區的第一個「部分」後,會發生相反,你需要打印所有。

for (i=0; i<255; ++i) { 
    printf("%s\n", question[i]); 
} 

確保你空終止之前('\0')中的question行,這樣你就不會爲初始化行打印垃圾。或者只是維持上次的好行的索引和重複,直到

另外,循環

for(j; data[j]!='@', j++) 

將停在第一'@',和外部循環的所有隨後的迭代將評估相同j(這是'@'索引中,因此環路處於進一步迭代跳過。您將需要內部循環後推進j

,你還需要最後'@'後保持最後所j位置,以便能夠從最後'@'計算j的位置,所以你可以索引question[i]正確。在上段建議的額外推進之後,將lastj設置爲值j。此外,question的第二個索引從現在開始應該是j-lastj

關於內部循環的另一件事是:在最後的'@'之後它將超過data的字符串,因此您還必須檢查noll-termination。

此外,請確保您在question中空字符串結尾,否則printf將產生垃圾(並且在到達未分配給您的程序的內存時可能會產生垃圾錯誤)。只寫

question[i][j-lastj] = '\0'; 

後內循環。(j將已經指出在內部循環結束最後寫入指數後)

然而,一兩件事:不要重複i直到data長度,你將不再需要觸摸到了許多元素(可能會在內部循環中過度索引data)。使用while環代替,僅增大,直到你在內部循環覆蓋dataji

:仰望strtok使標記化更容易對你的一部分

+0

我已經做了所有你說,雖然printf給了我一些數字,奇怪的符號......我試過%c和%s,都打印了我的符號... – AmitM9S6

+0

@AmitM9S6 - 首先,你還沒有清除'question'第一。另外,(我錯過了這個帖子)你需要保留'@'後的'j'的最後一個位置,這樣你就可以把這個角色放在'question'的正確位置。看到一個工作代碼在這裏:[ideone.com](http://ideone.com/j6rcv) – Attila

+0

謝謝,它的作品! – AmitM9S6

0

我會使用類似strchr到得到下一個'@'的位置。

該算法是這樣的:您獲得下一個'@'的位置,如果沒有找到,則將next設置爲該字符串的末尾。然後從字符串的當前beginning複製到next的位置到您想要的位置。請記住終止複製的字符串!將字符串的beginning設置爲next以外的一個。重複,直到beginning超出數據的結尾。

編輯:代碼爲我的解決方案:

char *beg = data; 
char *end = data + strlen(data); /* Points to one beyond the end of 'data' */ 

for (int i = 0; beg < end; i++) 
{ 
    char *next = strchr(beg, '@'); /* Find next '@' */ 
    if (next == NULL) 
     break; /* No more '@' */ 

    memcpy(question[i], beg, next - beg); /* Copy to array */ 
    question[i][next - beg] = '\0'; /* Remember to terminate string */ 

    beg = next + 1; /* Point to next possible number */ 
} 

注:未測試。可能是與複製之一,可能必須是next - beg - 1。 (即使經過25年的C語言編程,我似乎總是在第一次嘗試時遇到錯誤... :))

+0

我寧願不使用鏈表或類似的東西...... – AmitM9S6

+0

@AmitM9S6無鏈接列表,只需將字符串(使用'strncpy'或'memcpy')複製到您的數組中,然後增加索引。 –

+0

我明白了,謝謝你的回答! – AmitM9S6

0

有一種更簡單的方法來做到這一點。使用strtok來標記字符串"@",然後使用strcpy將標記化的字符串複製到您的question陣列中。例如(未測試):

char *pcur = data; 
int i = 0; 

do 
{ 
    if ((pcur = strtok(pcur, "@")) != NULL) 
    { 
    strcpy(question[i], pcur++); 
    printf ("%s\r\n", question[i++]); 
    } 
} 
while (pcur != NULL); 

如在上面的例子中所示,遞增i移動question數組索引到下一個位置,並且遞增pcur通過移動標記化字符串指針過去的清零令牌爲下一次迭代循環。

參見:

+0

'if'語句可能會在某些編譯器中發出警告,最好使用類似'if((pcur = strtok(pcur,「@」))!= NULL)' –

+0

@JoachimPileborg:謝謝!我更新了這個例子。 –