2016-01-21 132 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。在这种情况下,您可以在编码时留下最后的循环。

相关问题