【问题标题】:How to make conversion function work?如何使转换功能起作用?
【发布时间】:2017-04-12 04:15:28
【问题描述】:

我有一段代码正在尝试学习如何在 C++ 中进行解析。我理解我所做的一切,但我不明白如何使用 atoi()、atof()、strtod() 之类的东西。我知道它应该做什么,但我不明白为什么编译器不喜欢它。我对错误的关注是“scores[line_count] = strtod (score);”

#include <iostream>
#include <fstream>
#include <string>
#include <stdlib.h>
#include <iomanip>

using namespace std;

int readScores(string inputFile, string name[], float scores[], int     array_size)
{
//delcare variables
ifstream infile;
int line_count = 0;
string line;
string named;
float score;
char character;
int word_index;
string names[array_size];


// open input file
infile.open(inputFile);

//Check if file opens succesfully.
if(infile.fail())
{
    cout << "File cannot open!!" << endl;
    return -1;
}

while(getline(infile, line))
{
    cout << line << endl;
    // PARSING GOES HERE

    word_index = 0;

    for(int i=0; i < (int)line.length(); i++)
    {
        character = line[i];

        if (character == ',')
        {
            names[line_count] = named;
            named = "";
            word_index++;
        }
        else
        {
            if(word_index == 0)
            {
                named += character;

            }
            else if (word_index == 1)
            {
                score += character;
                cout << character << " " << endl;
            }
        }

    }
scores[line_count] =  strtod (score);



    line_count++;

}

//close file
infile.close();

//return line count
return line_count;
cout << line_count << endl;
}

int main(void)
{
int array_size = 50;
string inputFile = "Test.txt";
string name [array_size];
float scores [array_size];


readScores(inputFile, name, scores, array_size);
}

【问题讨论】:

  • “编译器不喜欢它”不是一个很有帮助的描述。
  • 它给了我一个错误。它说,“不能将参数 1 的浮点数转换为 const char*。”
  • @Robbie 那么为什么它没有帮助呢?您传递的是 float 而不是 char *
  • 我正在读取一个文件,上面写着“Robbie,59,32,23”,它作为一个整体读取它。我正在尝试将 59 转换为浮点值。我只是在学习如何使用这种方法进行解析。我猜 stringstream 是最好的方法。

标签: c++ parsing data-conversion


【解决方案1】:

函数 strtod() 采用以下形式

double strtod (const char* str, char** endptr);

但你只给它字符串。

如您所见,它有两个参数,您希望转换为双精度的字符串和一个“endptr”。 endptr 被描述为here

引用已分配的 char* 类型对象,其值由 > 函数设置为 str 中数值之后的下一个字符。 该参数也可以是空指针,这种情况下不使用。

所以你需要声明一个 char 指针来保存小数点后的下一个字符,即使不会有一个。这允许您从单个字符串中提取多个双精度数,就像分词器一样。

char * endPtr;
scores[line_count] = strtod(score, &endPtr);

编辑

正如 Alex Lop 指出的那样,您甚至没有将字符串传递给 strtod,而是传递了一个浮点数。看来您想将浮点数转换为双精度数?

【讨论】:

  • 好吧...假设我将其更改为 atof(score)...我仍然遇到同样的错误。双 afof(const char* _nptr)
  • 那是因为 atof() 将字符串转换为浮点数,而您仍将传递给它一个浮点数。我的建议是在使用它们之前查看函数的手册页,这样你就可以确切地知道它们的作用,以及它们需要传递的参数。
【解决方案2】:

当然编译器不喜欢它。请阅读strtod的描述。

double strtod (const char* str, char** endptr);

string 转换为 double.

解析 C 字符串 str 将其内容解释为浮动 点号(根据当前语言环境)并返回其值 作为double。如果 endptr 不是 null 指针,该函数还设置 endptr 的值指向数字后的第一个字符。

函数首先丢弃尽可能多的空白字符(如 isspace) 根据需要,直到第一个非空白字符 成立。然后,从这个字符开始,取尽可能多的字符 可能在类似于浮动的语法之后是有效的 点文字(见下文),并将它们解释为数值。 在最后一个有效字符之后指向字符串其余部分的指针是 存储在endptr指向的对象中。

在您的代码中,您只将一个类型为float 的参数传递给strtod,并将double 的返回结果存储到floats 的数组中。如果要将float 的值从一个变量移动到另一个变量,则不需要任何“转换”函数:

scores[line_count] = score; 

注意:我并没有真正审查您的代码,因为您专门询问了 scores[line_count] = strtod (score);。但是在我查看了您如何修改score 之后,也许它应该是string 而不是float。如果是这样,那么这是另一个需要解决的问题。

【讨论】:

    猜你喜欢
    • 2021-01-17
    • 1970-01-01
    • 2021-08-18
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    • 2012-09-18
    • 1970-01-01
    相关资源
    最近更新 更多