在相同的代码中使用C-strings和STD :: String

Using c-strings and std::string in the same code

本文关键字:C-strings STD String 代码      更新时间:2023-10-16

我想知道以下代码是否为"有效":

#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 中是有效的,因为[]运算符是字符串类的一部分。此外,可以添加

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) {
        /*..*/
    }
}

谢谢大家!

此代码有一个潜在的问题:

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

s[i]char,它可能是签名类型。如果字符值为负,则此循环导致不确定的行为,因为j的最终溢出。

在ASCII系统上,此精确代码不包含负字符,但是在EBCDIC中,Newline是0x85,如果系统具有纯char为signed

要在安全的一侧,应该是for (int j = 0; j < (unsigned char)s[i]; ++j)。或在基于范围的版本中,使用for (unsigned char c: s)