无法将字符串从命令行转换为浮点数组

时间:2011-03-24 17:43:44

标签: c++

char * temp_array;

strcpy(temp_array, argv[i + 1]);

            for(int j = 0; j < 8; j++)
            {
                fann_input[j] = atoi(temp_array[j]);
                printf("%f\n", fann_input[j]);
                printf("o%c\n", temp_array[j]);
            }

fann_input是一个浮点数组。

atoi线上的

,我收到错误:

src/main.cpp: In function ‘int main(int, const char**)’:
src/main.cpp:117: error: invalid conversion from ‘char’ to ‘const char*’
src/main.cpp:117: error:   initializing argument 1 of ‘int atoi(const char*)’

有什么想法吗?

每个字符都是1或0

6 个答案:

答案 0 :(得分:3)

各种不好的地方:

  1. 您正在尝试将字符串复制到未初始化的char*temp_array已声明但从未初始化

  2. atoi需要指向整个字符串的指针,但是您传递的是一个字符(temp_array[j]

  3. fann_input是一个float的数组(你说),但是你试图用int s填充它(这是atoi返回的)< / p>

  4. 您在C ++中使用C构造(指针,atoi等)

  5. 你一遍又一遍地使用相同的命令行参数。

  6. 在这些方面做更多的事情。未编译的psudocode如下。错误处理留给你一个练习。

    for( int j = 0; j < 8; ++j )
    {
      stringstream ss;
      ss << argv[j+1]; // copy cmd line param to stream
      float val = 0.0f;
      ss >> val;  // convert to a float
      fann_input[j] = val;  // save it!
    }
    

答案 1 :(得分:1)

temp_array[i]正是编译器告诉你的 - charatoi()将字符串作为唯一参数。您需要更正算法以将字符串传递给atoi()

答案 2 :(得分:1)

  1. main的原型为int main(int argc, char **argv),即使argv应视为常量。
  2. 您正在复制到内存的随机部分,因为temp_array未初始化。
  3. 您在单个字符而不是字符串上调用atoi
  4. atoi转换为int,而不是转换为float,尽管这不应该是{0,1}输入的问题。
  5. 要将字符串s中的个别数字转换为float,请执行

    float x = s[i] - '0';
    

    (假设一个ASCII或EBCDIC兼容的字符集,其中1跟随0.我从来没有听说过一个不符合的字符集。)

答案 3 :(得分:0)

你能发布完整的代码吗?

你在循环外使用“i”,然后在for循环中重新定义它,然后看起来你正试图将字符串的每个CHARACTER转换成它自己的浮点数?

答案 4 :(得分:0)

对于一个哟,实际上并没有在temp_array中分配任何空间。这将为您提供一个很好的运行时错误。

以下代码行错误并为您提供错误:

fann_input[i] = atoi(temp_array[i]

当你想要一个字符串时,你将1个字符传递给atoi。

另外

strcpy(temp_array, argv[i + 1]);

在声明之前使用i。

答案 5 :(得分:0)

您尚未为temp_array分配任何空间,因此当您strcpy进入temp_array时,您会写入随机位置。当它是一个字符数组时,你将atoi视为一个字符串数组,然后尝试将单个字符转换为浮点数。 int会转换为float NOT转换为doubleatof。您需要使用#include <iostream> #include <string> #include <vector> int main(int argc, char* argv[]) { typedef std::vector<std::string> Args; Args args(&argv[1], &argv[argc]); std::vector<double> results; for(Args::const_iterator i = args.begin(); i != args.end(); ++i) { results.push_back(atof(i->c_str())); } return 0; }

这样的C ++ - esque方式怎么样,更好的是使用流:

{{1}}