2016-09-27 40 views
0

我已经拥有C语言的这段代码,是一个由逗号分隔的15个数据的字符串,代码将字符串用逗号分隔并将每个数据存储在一个名为array []的单个变量中,问题是如果在最后一个逗号之后没有数据,那么变量x15 = 0,但如果在最后一个值之后有一个值,则将该值转换为int。我打印数组[15]的值来验证,这是null,所以我出了一个条件,但不工作,该程序编译后只是中断。null在C语言中比较

char buf[] ="¶bL0 L3,01,+08590323,-079343001,010215,00000000000000,-tN,000,012689997,001219456,000,7FF2,C07F,0,4,"; 

printf("\n \n string=[%s]\n\n", buf); 
int i = 0; 
int u; 
char *p = strtok (buf, ","); 
char *array[16]; 
char *y15; 
while (p != NULL) 
{ 
    array[i++] = p; 
    p = strtok (NULL, ","); 
} 

for (i = 0; i <16; ++i){ 
     if(array[15] == NULL){ 
      wbt.x15=0; 
     }else{ 
     wbt.x15=atoi(array[15]); 
     } 

//printf("data: [%s]\n", array[i]); 
} 
+0

你可以重写你的问题?有段落是有原因的。 – nbro

+0

为什么不设置合理的断点, G。在'for'循环的开始处,以及'array'上的监视器,然后逐步执行程序?你会看到数组的值是如何改变的。 – Jireugi

+0

编译后程序崩溃了......一旦编译完程序,你做了什么?程序编译后不会简单地中断,它们会破坏你的大脑,或者当你写它们时。但是如果你编译了一个程序,它不会自发地破坏。 –

回答

1

您正在使用未初始化的数组元素,这会导致未定义的行为。

您有:

char *array[16]; 

数组的元素是未初始化。然后,你继续使用:

if(array[15] == NULL){ 
    wbt.x15=0; 
    }else{ 
    wbt.x15=atoi(array[15]); 
    } 

不清楚为什么你有循环的每一次迭代检查,但这是另一个问题。发布代码的问题是array[15]未初始化。使用该值是一个问题。

请确保您正确初始化array。用途:

char *array[16] = {0}; 

另外,我觉得你的for循环需要是这样的:

for (i = 0; i <16; ++i) 
{ 
    int x = 0; 
    if(array[i] != NULL) 
    { 
     x = atoi(array[i]); 
    } 

    // Now use x. 
} 
+1

基于数组的构造方式,使用'while/strtok'循环,我认为'for'循环应该只是以null结束:if(array [i] == NULL)break;' –

+0

非常感谢你,它只是简单的初始化数组。我们每天都在编程学习,基本的东西实际上可以打破我们的头哈哈。 –

+0

@CraigEstey,同意。 –