2015-10-19 43 views
-2

我試圖用函數填充幾個字符串,但字符串似乎沒有被正確填充。 print語句只有4個空行。但如果我取消註釋char ** pls行,它將正確打印所有三個字符串,即使我從不在任何地方使用變量pls。它也可以在調試模式下正常運行而不存在變量。我不完全確定我做了些什麼,但並不高興。函數調用中未填充C字符串

char * dataFile = (char *) calloc(64, sizeof(char)); 
//char ** pls = &dataFile; 
char * queryFile = (char *) calloc(64, sizeof(char)); 
char * outFile = (char *) calloc(64, sizeof(char)); 
for(i = 1; i <argc; ++i) 
{ 
    char command[3]; 
    char * iterator = argv[i]; 
    command[0] = *iterator; 
    ++iterator; 
    command[1] = *iterator; 
    ++iterator; 
    command[2] = *iterator; 

    if(strcmp(command, "df=") == 0) 
     determineFileString(iterator, &dataFile); 
    else if(strcmp(command, "if=") == 0) 
     determineFileString(iterator, &queryFile); 
    else if(strcmp(command, "of=") == 0) 
     determineFileString(iterator, &outFile); 
} 
printf("%s\n%s\n%s\n", dataFile, queryFile, outFile); 

void determineFileString(char * iterator, char ** file) 
{ 
    char * p = *file; 
    ++iterator; 
    while(*iterator != '\0') 
    { 
     *p = *iterator; 
     ++p; 
     ++iterator; 
    } 
    *p = '\0'; 
} 
+0

「即使我從不在任何地方使用變量,它會正確打印所有三個字符串」的味道像未定義的行爲。 – Downvoter

+0

在C中不需要使用calloc,它的返回類型是void *。任何方式回來的代碼,實際上編譯來看看程序是如何工作的。 – Michi

回答

3

您打電話給strcmp但第一個操作數不指向一個字符串。一個字符串被定義爲一些字符後跟一個空終止符。

如果argv[i]字符串短於2個字符,您的代碼也會導致未定義的行爲,因爲您總是從中複製3個字符。

若要解決此問題,請使command變大並在末尾放置一個空終止符,或使用memcmp而不是strcmp。 (但是要注意memcmp,因爲如果兩個物體的尺寸至少不一樣大,它也會導致UB)。

這裏是一個可能的解決辦法:

for(i = 1; i <argc; ++i) 
{ 
    if (strlen(argv[i]) < 3) 
     continue; 

    if (memcmp(argv[i], "df=", 3) == 0) 
     determineFileString(argv[i] + 3, &dataFile); 

    else if // etc. 
}    

順便說一句,在determineFileString功能沒有做任何的緩衝區大小檢查(也可能緩衝區溢出)。我建議重新設計這個功能;也許它可以做一個長度檢查,並在函數內部調用realloc

+0

這將是我的問題,謝謝。 – Brandon