2009-11-27 64 views
1

我在解析函数时遇到了一些麻烦,所以我放了一些cout语句告诉我运行时某些变量的值,并且我相信atoi不正确地转换字符。我错误地使用atoi吗?

继承人我的一小段程式码,多数民众赞成举止怪异:

c = data_file.get(); 
if (data_index == 50) 
    cout << "50 digit 0 = '" << c << "' number = " << atoi(&c) << endl; 

输出的这种说法是: 50 digit 0 = '5' number = 52

我打电话一个循环内的代码,并且什么奇怪的是,它正确地转换了前47个字符,然后在第48个字符后它在整数后面加了一个0,在第49个字符上它增加了一个1,在第50个(见这里)它增加了一个2,一直到第57个字符它增加了一个9,然后它继续正确地转换到第239个字符。

这是奇怪的还是什么?

只是澄清一点点我会发布整个功能。这个函数会得到一个指向空双阵列(ping_data):

int parse_ping_data(double* ping_data) 
{ 
    ifstream data_file(DATA_FILE); 

    int pulled_digits [4]; 
    int add_data; 
    int loop_count; 
    int data_index = 0; 

    for (char c = data_file.get(); !data_file.eof(); c = data_file.get()) 
    { 
     if (c == 't' && data_file.get() == 'i' && data_file.get() == 'm' && data_file.get() == 'e' && data_file.get() == '=') 
     { 
      loop_count = 0; 
      c = data_file.get(); 
      if (data_index == 50) 
        cout << "50 digit 0 = '" << c << "' number = " << atoi(&c) << endl; 
      pulled_digits[loop_count] = atoi(&c); 

      while ((c = data_file.get()) != 'm') 
      { 
       loop_count++; 
       if (data_index == 50) 
        cout << "50 digit " << loop_count << " = '" << c << "' number = " << atoi(&c) << endl; 
       pulled_digits[loop_count] = atoi(&c); 
      } 
      add_data = 0; 
      for (int i = 0; i <= loop_count; i++) 
       add_data += pulled_digits[loop_count - i] * (int)pow(10.0,i); 

      if (data_index == 50) 
       cout << "50 index = " << add_data << endl; 
      ping_data[data_index] = add_data; 
      data_index++; 

      if (data_index >= MAX_PING_DATA) 
      { 
       cout << "Error parsing data. Exceeded maximum allocated memory for ping data." << endl; 
       return MAX_PING_DATA; 
      } 
     } 
    } 

    data_file.close(); 

    return data_index; 
} 

回答

6

atoi接受一个字符串,即char S,而不是指向一个单一char一个空值终止阵列,所以这是不正确的,会得到你无法预料的结果。

char c; 
//... 
/* ... */ atoi(&c) /* ... */ 

此外,atoi不提供任何方法来检测错误,所以宁愿strtol和类似的功能。

E.g.

char *endptr; 
char c[2] = {0}; // initalize c to all zero 

c[0] = data.file.get(); // c[1] is the null terminator 

long l = strtol(c, &endptr, 10); 

if (endptr == c) 
    // an error occured 
2

没关系,它只是我需要将字符转换为以\ 0结尾的字符串。我把它改为这个代码:

char buffer [2];

buffer [1] ='\ 0';

buffer [0] = data_file.get();

如果(data_index用于== 50)

cout << "50 digit 0 = '" << buffer[0] << "' number = " << atoi(buffer) << endl; 

和它的工作。

+1

太棒了,但是当你使用atoi来回目的时,你还在用大炮射击麻雀。 – AnT 2009-11-28 03:25:18

3

atoi需要以空字符结尾的字符串作为输入。你所提供的不是以空字符结尾的字符串。

话虽如此,值得一提的是,要正确使用atoi非常困难(如果可能的话)。 atoi是一种不提供错误控制和无溢出控制的功能。在C标准库中执行字符串表示到数字转换的唯一正确方法是从strto...组开始的函数。

其实,如果你只需要转换一个字符数字,使用atoi或其他任何字符串转换函数是一个奇怪的矫枉过正。正如已经提出的那样,您只需从字符数字值中减去0的值即可获得相应的数值。语言规范保证这是一个便携式解决方案。