繁体   English   中英

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

[英]Trouble converting string from commandline to array of floats

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

这里的各种坏:

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

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

  3. fann_input是一个float数组(您说),但是您尝试用int填充它(这是atoi返回的)

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

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

按照这些思路做更多的事情。 未编译的伪代码如下。 错误处理留给您练习。

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!
}

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

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

要将字符串s的单个数字转换为float ,请执行

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

(假设1后面跟随0的ASCII或EBCDIC兼容字符集。我从未听说过不正确的字符集。)

您可以发布完整的代码吗?

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

对于您来说,实际上并没有在temp_array中分配任何空间。 那会给你一个很好的运行时错误。

以下代码行是错误的,并给您带来错误:

fann_input[i] = atoi(temp_array[i]

您需要将1个字符传递给atoi时需要一个字符串。

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

在声明之前使用i。

您还没有分配任何空间temp_array所以,当你要写信给随机位置strcpy进去。 当将temp_array为字符数组时,您temp_array视为字符串数组,然后尝试将单个字符转换为浮点数。 atoi将转换为int不是floatdouble 您需要使用atof

像这样的C ++风格的方法呢,甚至更好的方法是使用流:

#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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM