2017-07-03 50 views
0

當我嘗試從C中的文件名中提取2或3位數字的字符串時,出現奇怪的錯誤,有時候它執行正確,有時它不會,輸入的文件名是「EC2_122016_1676_corte22_03012017084106.TXT」,我只想要「corte22」中說「22」的部分。當從C中的字符串中提取數字時出現奇怪的錯誤

在這種情況下的正確結果應該是「代碼:022」,但有時它會顯示另一個值,如「代碼:223」或「代碼:224」,我沒有太多的C語言經驗,我無法解釋爲什麼會發生這種情況,有什麼幫助?

下面是我使用的文件名與代碼分開的代碼:

int main(int argc, char *argv[]) { 
    char *sourceFileName = "EC2_122016_1676_corte22_03012017084106.TXT"; 
    char fileCode[4] = "\0"; 

    strcpy(fileCode, extractFileCode(sourceFileName)); 
    printf("Code: %s\n", fileCode); 
} 


char* extractFileCode(const char sourceFileName[]) { 
    char *tmp = strdup(sourceFileName); 
    strlwr(tmp); 

    char *result = strstr(tmp, "corte"); 
    result = strtok(result, "_"); 
    result = extractNumbersFromString(result); 

    char *t; 

    // convert the number back to string, but add a leading zero 
    sprintf(result, "%.3d", strtol(result, &t, 10)); 

    free(tmp); 

    return result; 
} 

char* extractNumbersFromString(const char *source) { 
    char *result = malloc(strlen(source) * sizeof(char)); 

    int index = 0; 
    int i; 

    for(i = 0; i < strlen(source); i++) { 
     if(isdigit(source[i])) { 
      result[index++] = source[i]; 
     } 
    } 

    return result; 
} 
+3

(和緩衝區太短) –

+3

不要發佈文字圖片! – Olaf

+0

@ Jean-FrançoisFabre當你說buff太短時,你是什麼意思?最終數字永遠不會超過3個字符。 –

回答

4
extractNumbersFromString

你不NUL終止result(和緩衝區太短),所以另一個數字可以滑在緩衝區的末尾。

修復:

char* extractNumbersFromString(const char *source) { 
    char *result = malloc(strlen(source) + 1); 

    int index = 0; 
    int i; 

    for(i = 0; i < strlen(source); i++) { 
     if(isdigit(source[i])) { 
      result[index++] = source[i]; 
     } 
    } 
    result[index] = '\0'; 

    return result; 
} 

除了* sizeof(char)是無用的,因爲在`extractNumbersFromString`你不是NUL終止`result`始終爲1

+0

我知道sizeof(char)毫無意義,但我不想把1放在那裏,但我更喜歡你的建議。非常感謝 –

+0

有趣的是,我得到了結果[index] ='\ 0';起初,我把它刪除,原因不明。 –

+1

奇怪的是'isalpha(some_char_that_may_have_a_negative_value)'沒有被很好地指定。建議'isdigit((unsigned char)source [i])'。 – chux