簡體   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