2016-01-21 425 views
1

陣列以下是我的代碼,只是strok一個例子爲什麼__lib_start_main出現在字符串

#include "stdio.h" 
#include "string.h" 
#include "stdlib.h" 
#define NUMBER_OF_STRINGS 10 
int main(){ 
    char str[] = " SELECT CID FROM ACN WHERE ACN=:C1 AND ACCTNAME=:C2#/ROWS=30/USING=(C1=70,C2='OD100S')"; 
    char *strs[NUMBER_OF_STRINGS]; 
    int i = 0; 
    for (char *p = strtok(str," "); p != NULL; p = strtok(NULL, " ")) 
    { 
     if(i < NUMBER_OF_STRINGS){ 
     strs[i] = malloc(strlen(p)+1); 
     strcpy(strs[i], p); 
     i++; 
     } else { 
      break; 
     } 
    } 

    for(i = 0 ; i < NUMBER_OF_STRINGS ; i++){ 
     if(strs[i] != NULL) 
      printf("%s\n",strs[i]); 
    } 

    return 0; 
} 

當可疑交易報告的印刷陣列,我得到

[[email protected] /]# ./test 
SELECT 
CID 
FROM 
ACN 
WHERE 
ACN=:C1 
AND 
ACCTNAME=:C2#/ROWS=30/USING=(C1=70,C2='OD100S') 
__libc_start_main 

我不知道爲什麼「__libc_start_main」在我的陣列中的字符串商店

請幫我清除它,謝謝!

回答

2

您正在閱讀的是未初始化的指針(s),即undefined behaviour

你只有i數循環後弦的,NUMBER_OF_STRINGS字符串。

您可以將循環後的字符串總數存儲在另一個變量中,並在打印時使用它。

for (char *p = strtok(str," "); p != NULL; p = strtok(NULL, " ")) 
    { 
    .... 
    } 

    size_t num = i; 

    for(i = 0 ; i < num ; i++){ 
     if(strs[i] != NULL) 
      printf("%s\n",strs[i]); 
    } 
+0

問題已解決,謝謝 – Ryo

1

變化

for(i = 0 ; i < NUMBER_OF_STRINGS ; i++){ 
    if(strs[i] != NULL) 
     printf("%s\n",strs[i]); 
} 

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

在你的代碼總是讀指針數組的所有值,但一些位置不inited。那是UB

另一種解決辦法是添加

memset(strs, 0, NUMBER_OF_STRINGS); 

數組聲明之後對整個陣列初始化到NULL。在這種情況下,您可以在編碼時留下最後的循環。

相關問題