下面的代码应该从字符串s中获取数据,并将其拆分为以空格作为分隔符的双数组数据。当j计数器应该递增以终止函数时,它意外地重置
传递给函数的char*s是

0.0000000E00     0.0000000E00       -1.9311798E+03       8.0321814E+02       8.0294336E+02

下面的诊断打印功能打印:
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;
  }
}

最佳答案

你的循环:

   while(!(*s == ' ' || *s == '\t'))
      buff[i++] = *s++;

还应包含字符串结尾的测试。例如s
否则,while(!(*s == ' ' || *s == '\t') && *s) ...将继续充满“噪音”,直到溢出。然后堆栈上的其他变量将开始被删除,例如buff。但是这种行为非常依赖于编译器。

09-30 16:51
查看更多