下面的代码应该从字符串s获取数据并将其拆分为双数组数据,并使用空格作为分隔符。当j应该递增以终止函数时,j计数器意外复位
传递给函数的char *是
0.0000000E00 0.0000000E00 -1.9311798E+03 8.0321814E+02 8.0294336E+02
下面的诊断printf功能打印:
0.000000 | 1
0.000000 | 2
-1931.179800 | 3
803.218140 | 4
802.943360 | 1
导致程序崩溃
void split_data(char *s, double *data, int fields) {
char buff[DATA_MAX];
int j = 0, i;
for(; *s; *s++) {
while(*s == ' ' || *s == '\t') /* trim leading white space */
*s++;
i = 0;
while(!(*s == ' ' || *s == '\t'))
buff[i++] = *s++;
buff[i] = 0;
data[j++] = atof(buff);
printf("%lf | %d\n", data[j-1], j);
if(j == fields)
return;
}
}
答案 0 :(得分:0)
你可能使buff
太短了,所以你的程序超出了缓冲区的末尾(可能只有一个字符)。这将导致它覆盖下一个堆栈变量,可能是j
。
尝试增加DATA_MAX
,看看是否能解决问题。
答案 1 :(得分:0)
你的循环:
while(!(*s == ' ' || *s == '\t'))
buff[i++] = *s++;
还应该包含字符串s
末尾的测试。例如while(!(*s == ' ' || *s == '\t') && *s) ...
。
否则,buff
将继续充满“噪音”,直至溢出。然后堆栈上的其他变量将开始被破坏,例如j
。但是这种行为与编译器有关。
答案 2 :(得分:0)
如果fields
大于字符数组中的字符串数,则程序可能会崩溃,因为退出条件仅基于j与fields
的比较。您可以在代码中尝试进行以下修改吗?
if((j == fields) || (*s == '\0'))
return;
答案 3 :(得分:0)
问题是你的第二个循环:
while(!(*s == ' ' || *s == '\t'))
buff[i++] = *s++;
buff[i] = 0;
你继续填充缓冲区,除非你达到'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''如果你很幸运,你继续阅读的内存包含任何'''\ t',你的循环将在你的缓冲区已满之前停止。
要解决您的问题,您还应检查第二个循环中的'\ 0' - 如果您在第一个循环中执行此操作会更好(以防万一没有足够的值来解析)或添加额外的''或'\ t'到你的字符串的末尾。