【问题标题】:Using c-strings and std::string in the same code在同一代码中使用 c-strings 和 std::string
【发布时间】:2019-05-19 10:13:51
【问题描述】:

我想知道以下代码是否“有效”:

#include <iostream>
using namespace std;

int main(void) {
    string s="Hello World!\n";
    for (int i=0;i<s.size();++i) {
        for (int j=0;j<s[i];++j) {
            cout << "+";
        }
        cout << ".>\n";
    }
}

我编写了这段代码,但我不知道是否应该添加一些“.c_str”或者其他,以使其代码更好。

【问题讨论】:

  • 不是在 C 中,而是在 C++ 中,是的。为什么?再多的c_str 也不会让代码变得更好,只会变得更糟。
  • 我不知道在不创建新的字符选项卡和使用 .c_str() 的情况下使用 s[i] 是否正确。
  • 当然是,你只是访问字符串中的一个元素,就是访问器的点。
  • 您不能将这两种实现都用于 C 和 C++。可以编写一些两种语言都可以使用的代码,但并非总是如此
  • 使用 for 范围更简单:for (char c : s) {for (int j = 0; j != c; ++j) {/*..*/}}.

标签: c++ string c-strings stdstring


【解决方案1】:

此代码存在潜在问题:

for (int j=0;j<s[i];++j) {

s[i]char,可能是有符号类型。如果字符值为负,则此循环会由于 j 的最终溢出而导致未定义的行为。

在 ASCII 系统上,这个确切的代码不包含负字符,但在 EBCDIC 中,换行符是 0x85,如果系统将纯字符 signed 转换为负字符值。

为了安全起见,它应该是for (int j = 0; j &lt; (unsigned char)s[i]; ++j)。或者在基于范围的版本中,使用for (unsigned char c: s)

【讨论】:

  • 好的。谢谢你的澄清!
【解决方案2】:

感谢所有的贡献,我现在可以说我的代码在 C++ 中是有效的,因为 [] 运算符是字符串类的一部分。 此外,还可以补充一点

for (char c : s) {
    for (int j = 0; j != c; ++j) {
        /*..*/
    }
}

简称

for (int i = 0; i < s.size(); ++i) {
    for (int j = 0; j < s[i]; ++j) {
        /*..*/
    }
}

谢谢大家!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-22
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    相关资源
    最近更新 更多