Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;-如何将char*子字符串解析为int?_C++_String_Parsing - Fatal编程技术网

C++ C++;-如何将char*子字符串解析为int?

C++ C++;-如何将char*子字符串解析为int?,c++,string,parsing,C++,String,Parsing,我正在处理一个模拟文件。该文件有许多行,其中包含数字、字母和字符 例如: GR123,7894.5444,A,4687.5643,P GR456,1234.6556,A,9657.5686,P GR789,2344.3422,A,9786.8465,P GR987,6522.6354,A,3245.5754,P 我需要取A和p之前的值(对于第一行,7894.5444和4687.5643) 如何通过将此字符串定位为int来解析?已试用过: double e

我正在处理一个模拟文件。该文件有许多行,其中包含数字、字母和字符

例如:

    GR123,7894.5444,A,4687.5643,P
    GR456,1234.6556,A,9657.5686,P
    GR789,2344.3422,A,9786.8465,P
    GR987,6522.6354,A,3245.5754,P
我需要取A和p之前的值(对于第一行,7894.5444和4687.5643)

如何通过将此字符串定位为int来解析?已试用过:

    double exampleA = stoi(row.substr(6,9));
    double exampleP = stoi(row.substr(18,9));
但是它给了我这个错误:
请求'row'中的成员'substr',它是非类类型'char*'

还尝试:

    char exampleA[9];
    char exampleP[9];

    memcpy(&exampleA, &row[6],sizeof(exampleA));
    memcpy(&exampleP, &row[6],sizeof(exampleP));
为了在将值与行分离后进行转换,但memcpy缓冲区始终会将exampleP的值与exampleA类似:

    A : 7894.5444
    P : 4687.5643?7894.5444
请求“行”中的成员“substr”,该成员为非类类型“char*”

是的,你不能在指针上调用
substr
。也许您想将这些东西存储在
std::string
实例中

至于你的第二次尝试,你写的东西有很多大问题:

  • 您正在使用的缓冲区长度为9字节,但示例中的最大值看起来是10字节(4+1+4+1)。您正在溢出缓冲区并覆盖进程中的随机内存。编辑:或者,如果您编写了正确的以null结尾的字符串,您将是

  • 与上述内容相关,因为它隐藏了问题,所以不要使用
    memcpy
    复制字符串。更好的第一次尝试是
    strncpy
    将子字符串复制到缓冲区,尽管您仍然需要手动将其终止为null


  • p
    行显示这两个条目的原因是编译器似乎将
    exampleA
    放在堆栈上的
    exampleA
    之后,由一个保护字符分隔,并且由于没有null终止字符串,因此试图显示
    exampleA
    溢出到
    exampleA
    ,完全出于运气,它后面似乎跟有一个空字符。

    由于数据似乎是C字符串,您不妨使用它,它的优点是不需要您复制子字符串:

    char* endp;
    double exampleA = std::strtod(row+6, &endp);
    double exampleP = std::strtod(row+18, &endp);
    
    在这两种情况下,您可能需要仔细检查
    *endp==','
    ,并且没有显示任何转换错误

    当然,即使使用
    std::string
    ,也可以使用
    std::strod
    。这通常是最有效的解决方案

    请注意,
    strtod
    具有区域设置意识,因此如果输入与当前区域设置不一致(例如,文件使用句点fir小数和逗号作为字段分隔符,而区域设置分别使用逗号和分号),则这可能不起作用


    我不知道你把浮点数转换成整数是什么意思(截断?舍入?乘以10000?)。所以我没有回答这部分问题。

    您试图使用
    std::string
    语法来表示
    char*
    ,为什么不首先使用
    std::string
    ?它不是CSV而是TXT文件。我将尝试调整这个问题的答案。我使用strncpy也有同样的问题。你不能帮助我使用代码吗?你有空终止你的字符串吗?没有,因为我已经收到了那种格式的txt文件。我应该在迭代中添加“\0”吗?“不,因为我已经收到了那种格式的txt文件”——这与您的文件无关,在C中,所有字符串都必须以null结尾。它返回错误
    错误:无法基于转换为“char**”类型来解析重载函数“end”
    您使用命名空间std执行
    并获取问题。我把
    end
    改为
    endp
    ,以防万一。但是我同意
    使用名称空间std产生的问题超过了它的价值。