2017-02-12 34 views
0

我試圖做一個簡單的代碼,將一種數據類型轉換爲另一種。我使用strtok來提取數據的一部分,然後運行一長串的if條件來查找正確的輸出。但是,當找到正確的輸出並寫入變量currentNote時,它似乎也會覆蓋變量comma,這是我找不到的原因。這裏是代碼的問題部分:如何防止strcpy覆蓋另一個變量?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() 
{ 
    char sequence[] = "c1[M],c1[M],d3[L],c3[M],b2[M],(#A-2)[IKN],(#A-1)[L]"; 
    char copy[] = ""; 
    char *comma; 
    char currentNote[4] = ""; 

    strcpy(copy, sequence); 

    comma = strtok(copy, ","); 

    if(strstr(comma, "c1") != 0)  //c1 
     { 
       printf("%s\n\n", comma);   //Here ... 
       strcpy(currentNote, "C5 "); 
       printf("%s\n\n", comma); 
     } 
    return 0; 
} 

而這裏的結果:

c1[M] 

cC5 

沒有必要說strcpy(currentNote, "C5 ");導致它。我不知道爲什麼,但我認爲它會像我想要的那樣返回c1[M]。經過一些實驗後,第二個printf("%s\n\n", comma);將始終返回sequence的第一個字符,然後是C5。我希望有人能夠發現,這將非常棒。

+0

也許給'複製'一些內存來存儲東西在 –

+0

這不會編譯。 「currentNote」聲明在哪裏? – ikegami

+1

'strcpy(copy,sequence)'不好。 'copy'沒有足夠的空間。 – ikegami

回答

1

要調用
strcpy(copy, sequence)copy是1個元件長度的數組。您需要通過給它足夠的大小來定義它。你的代碼是簡單的UB。重新定義它像

char copy[100];

或動態使用malloc分配足夠的內存給它。

+1

謝謝@chux。始終感謝您的反饋。剛編輯答案。 – VHS