Использование c-строк и std :: string в одном и том же коде - PullRequest
0 голосов
/ 19 декабря 2018

Я хотел бы знать, является ли следующий код "допустимым":

#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" или еще, чтобы сделатьэто лучше код.

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

В этом коде есть потенциальная проблема:

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

Значение s[i] - это char, что может быть типом со знаком.Если значение символа отрицательное, то этот цикл вызывает неопределенное поведение из-за возможного переполнения j.

. В системе ASCII этот точный код не содержит отрицательных символов, но в EBCDIC символ новой строки равен 0x85, чтопреобразовать в отрицательное символьное значение, если система имела простой символ как signed.

Чтобы быть в безопасности, оно должно быть for (int j = 0; j < (unsigned char)s[i]; ++j).Или в версии, основанной на диапазоне, используйте for (unsigned char c: s).

0 голосов
/ 19 декабря 2018

Благодаря всем вкладам я могу сказать, что мой код действителен на 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) {
        /*..*/
    }
}

Спасибо всем вам!

...