3

我正在尝试在 C++ 中操作字符串。我正在使用 Arduino 板,所以我可以使用的东西有限。我还在学习 C++(抱歉有任何愚蠢的问题)

这是我需要做的:我需要将每小时英里数发送到 7 段显示器。所以如果我有17.812345这样的数字,我需要将17.8显示到7段显示。似乎最有效的方法是首先乘以 10(这是将小数点右移一位),然后将 178.12345 转换为 int(将小数点去掉)。我坚持的部分是如何分解 178。在 Python 中,我可以对字符串进行切片,但我找不到任何关于如何在 C++ 中执行此操作的信息(或者至少,我找不到合适的搜索词为了)

有四个 7 段显示器和一个 7 段显示控制器。它的测量速度可达每小时十分之一英里。非常感谢您提供的帮助和信息。

4

5 回答 5

10

不将其转换为字符串可能是最简单的,而只是使用算术来分隔数字,即

float speed = 17.812345;
int display_speed = speed * 10 + 0.5;     // round to nearest 0.1 == 178
int digits[4];
digits[3] = display_speed % 10;           // == 8
digits[2] = (display_speed / 10) % 10;    // == 7
digits[1] = (display_speed / 100) % 10;   // == 1
digits[0] = (display_speed / 1000) % 10;  // == 0

并且,正如评论中所指出的,如果您需要每个数字的 ASCII 值:

char ascii_digits[4];
ascii_digits[0] = digits[0] + '0';
ascii_digits[1] = digits[1] + '0';
ascii_digits[2] = digits[2] + '0';
ascii_digits[3] = digits[3] + '0';
于 2009-12-05T06:56:59.883 回答
4

这是一种您可以在没有模数数学的情况下在 C++ 中完成的方法(无论哪种方式对我来说都很好):

#include "math.h"
#include <stdio.h>
#include <iostream.h>

int main( ) {

        float value = 3.1415;
        char buf[16]; 
        value = floor( value * 10.0f ) / 10.0f;
        sprintf( buf, "%0.1f", value );

        std::cout << "Value: " << value << std::endl;

        return 0;
}
于 2009-12-05T07:31:52.057 回答
3

如果您真的想将这些东西作为字符串处理,我建议您查看stringstream. 它可以像任何其他流一样使用,例如cinand cout,除了将所有输出发送到控制台之外,您可以获得实际string的交易。

这将适用于标准 C++。对 Arduino 了解不多,但一些快速的谷歌搜索表明它不支持字符串流。

一个简单的例子:

#include <sstream> // include this for stringstreams
#include <iostream>
#include <string>

using namespace std; // stringstream, like almost everything, is in std

string stringifyFloat(float f) {
  stringstream ss;
  ss.precision(1); // set decimal precision to one digit.
  ss << fixed;     // use fixed rather than scientific notation.
  ss << f;         // read in the value of f
  return ss.str(); // return the string associated with the stream.
}

int main() {
  cout << stringifyFloat(17.812345) << endl; // 17.8
  return 0;
}
于 2009-12-05T07:54:43.377 回答
0

您可以使用诸如此toString之类的函数并从那里向上工作,就像在 Python 中一样,或者仅使用模 10,100,1000 等将其作为数字来获取。我认为将其作为字符串操作可能对您来说更容易,但这取决于您。

您也可以使用boost::lexical_cast,但是在像您这样的嵌入式系统中可能很难让 boost 工作。

于 2009-12-05T08:14:05.670 回答
0

一个好主意是为显示实现一个流。这样就可以使用 C++ 流语法,并且应用程序的其余部分将保持通用。 尽管这对于嵌入式系统来说可能是多余的。

如果您仍想使用std::string,您可能需要使用反向迭代器。这样,您可以从最右边的数字(在字符串中)开始向左工作,一次一个字符。

如果您有权访问运行时库代码,则可以为显示器设置 C 语言 I/O。这比 C++ 流更容易实现。然后您可以使用 fprint、fputs 写入显示器。我在这个方法中实现了一个调试端口,其他开发人员使用起来更容易。

于 2009-12-05T19:30:20.140 回答