【问题标题】:Double variable Char variable双变量 Char 变量
【发布时间】:2013-09-05 07:32:53
【问题描述】:

我需要一点帮助。这个问题很简单,但对我有限的知识感到抱歉。我想将一维双精度数组转换为这样的字符矩阵..例如..双精度矩阵的第一个元素是

double version[6];
char version_ch[6][6];
version[0]=1.1587

我想将 version[0] 转换为 version_ch[0][5] 等等。每个版本变量都是 6 位数字。任何人都可以帮助我吗?

提前致谢。

【问题讨论】:

  • double 令人困惑??你想要二维矩阵?当您分配双值 1.1513want to convert version[0][0] into version_ch[0][6]. 不清楚
  • 你能再清楚一点吗,我不明白你想要达到什么目的。另外,version_ch[0][6] 越界
  • 你知道字符串"1.1513"七个个字符吗?您还必须具有字符串终止符。你有什么理由不使用std::stringstd::vectorstd::array
  • 请查看已编辑的问题...
  • 我同意灰熊的观点,你为什么需要这样做?你打算用version_ch 做什么?您可能想阅读about the XY problem

标签: c++ char


【解决方案1】:

这个怎么样:

const size_t num_versions = 6;

std::array<double, num_versions> version;
version[0] = 1.1587;
// ...

std::array<std::string, num_versions> version_str;
std::transform(std::begin(version), std::end(version), std::begin(version_str),
    [](const double& value) { return std::to_string(value); });

了解std::arraystd::stringstd::transformlambda expressionsstd::to_string

【讨论】:

  • 问题未标记为 c++11
【解决方案2】:

如果你真的想要你要求的 char 数组,那么你可以像这样生成它:

#include <cstdio>
#include <cstring>

// ...

    static const size_t VERSION_N_ELEM = 6;
    static const size_t VERSION_STR_LEN = 6;

    double version[VERSION_N_ELEM];
    char version_ch[VERSION_N_ELEM][VERSION_STR_LEN];

    char buf[32];
    for (int i = 0; i < VERSION_N_ELEM; ++i) {
        sprintf(buf, "%.4f", version[i]);
        strncpy(version_ch[i], buf, VERSION_STR_LEN);
    }

这比 c++ 更像是一种 c 方法,但话说回来,像你这样使用数组比 c++ 更像是一种 c 方法。在这里使用 sprintf 并不完全安全。如果你的编译器库中有 sprintf_s 或 snprintf,你应该考虑使用它。或使用 stingstreams。

由于您对预期用途的说明很少,因此您应该注意 char 'matrix' 中的字符串可能不会以 null 结尾,因为没有足够的空间。

【讨论】:

  • @pete..非常感谢..这就是我打算做的...获取对结果字符数组的访问权..谢谢
  • 你能告诉我我该怎么做vicaversa吗?..意味着将version_ch[0][6]转换为double version[0]
  • @SaadSaadi 使用strtod 函数。但是字符串必须是带有字符串终止符的正确字符串。
  • @SaadSaadi 是的,因为 Joachim Pileborg 建议使用 strtod。由于此矩阵中的字符串可能不是以空值结尾的,因此您需要一个 7 字节的数组将字符串 strncpy 到其中并将最后一个字节设置为 0 以确保它以空值结尾。然后使用 strtod 。或者,您可以将原始的“字符矩阵”设为 [6][7] 数组,并使所有行以空值结尾以避免复制。不知道根据你对这个数组的要求是否可行?
【解决方案3】:

您所要求的只是 C++ 中的糟糕设计。例如,您可以使用以下代码获得结果:

#include <sstream>
#include <iostream>
#include <string>

using namespace std;

int main(){
        double version[4] = {1.2, 3.4, 5.6, 7.8};
        char version_ch[4][3];

        for(unsigned int i = 0; i < 4; i++){
                stringstream ss; 
                ss << version[i];
                string tmp_str = ss.str();
                for(unsigned int j = 0; j < 3; j++){
                        version_ch[i][j] = tmp_str.c_str()[j];
                }   
        }   
}

但是,说真的,你应该修改你的设计!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-20
    • 2013-03-30
    • 2019-02-28
    • 2015-05-13
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多