Невозможно напечатать строку с помощью cout << method (); где метод () возвращает строку

ниже мой код

#include <iostream>
#include <string>
using namespace std;

string m(int x) {
    string h = "";
    char q;
    for(int i=0;i<x;i++) {
        q=i;
        h +=q;
    }
    return h;
}

int main() {
int x;
cin >> x;
cout << m(x) << endl;

return 0;
}

но это мой вывод, что это за странно выглядящие квадратные символы. Невозможно напечатать строку с помощью cout &lt;&lt; method (); где метод () возвращает строку

Строку не следует печатать, потому что на каждой итерации добавляется символ.

Как вы думаете, как будет выглядеть печать символьного представления целого числа 17 (например)? Взгляните на этот Таблица ASCII и посмотрите, каковы числовые значения для «нормальных» символов. Обратите внимание, что ни один из них не меньше 23.

BoBTFish 15.08.2018 08:41

Кроме того, пересмотрите возможность использования того, что часто считается плохой практикой: using namespace std; и endl (это ссылки на объяснения).

BoBTFish 15.08.2018 08:44

но я не видел этих символов раньше

shobhit 15.08.2018 08:45

Забавные квадраты - это, по сути, отказ вашего терминала: «этот символ, который вы хотите, чтобы я напечатал, - это какой-то непечатаемый мусор, поэтому здесь вместо него фиктивный символ». Если вы хотите распечатать числа, то есть 123456789101112131415..., см. Ответ acraig5075.

BoBTFish 15.08.2018 08:46

@BoBTFish Я согласен, но вся цель - сделать код как можно короче и точнее.

shobhit 15.08.2018 08:46

«Короткий» и «точный» - два совершенно не связанных между собой идеала. Укорочение кода часто затрудняет его понимание (по крайней мере, для человека), поэтому становится менее «точным» в том смысле, что точное предполагаемое значение не передается эффективно. endl менее точен, чем '\n', потому что он делает дополнительные вещи, которых вы, вероятно, не ожидали, и содержит точно такое же количество символов.

BoBTFish 15.08.2018 08:49

Если значение x не соответствует значению ASCII печатаемого символа, вы получите вот что!

PhoenixBlue 15.08.2018 08:52

Отредактируйте свой вопрос и скажите, что вы ожидаете увидеть. «12345 ...» или «abcde ...». В настоящее время ваш вопрос непонятен.

acraig5075 15.08.2018 09:04

@BoBTFish не менее 32. Или 20ч. 32 - это пробел, все символы под ним не печатаются (теоретически), потому что имеют особое значение. На практике некоторые из них имеют визуальное представление.

Swift - Friday Pie 15.08.2018 10:43
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
9
300
5

Ответы 5

Строки - это строки, а целые числа - это целые числа. Не путайте их и не ждите волшебства.

Попробуй это:

h += std::to_string(q);

@paxbun Это полностью причина проблемы, решение которой acraig5075 предлагает (на основе разумного предположения, что спрашивающий действительно хотел распечатать числа, а не представленные символы - это не совсем ясно из вопроса).

BoBTFish 15.08.2018 08:56

@BoBTFish Я не видел комментариев. Кстати, свой комментарий я удалил одновременно с вашим ответом, как я понял. Содержимое было «q is char, что означает, что h + = q эквивалентно h.push_back (q)».

paxbun 15.08.2018 08:58

Ваш терминал, вероятно, пытается интерпретировать строку как ASCII или UTF8. В любом случае, большинство символов со значением до 23 будут непечатаемыми управляющими символами.

Если вы начнете цикл с 33 вместо 0, вы получите более разумный результат.

Вы смешиваете целые числа со строками. Чтобы объединить строку, сначала вам нужно преобразовать символ int в строку. попробуйте код ниже:

#include <iostream>
#include <string>
using namespace std;

string m(int x) {
    string h = "";
    char q;
    for(int i=0;i<x;i++) {
        q=i;
        h += std::to_string(q);
    }
    return h;
}

int main() {
int x;
cin >> x;
cout << m(x) << endl;

return 0;
}

Вторая строка цикла for должна быть такой

h +=to_string((int)q);

Почему у вас явное приведение к int?

BoBTFish 15.08.2018 09:00

Потому что я думаю, что он хочет печатать числа через строку. Таким образом, char требует явного преобразования в int перед конкатенацией со строкой.

Mukarram Ishaq 15.08.2018 09:07

Я согласен с вашей интерпретацией вопроса, но почему вы думаете, что char c = 5; std::to_string(c); не работает? Т.е. вместо того, чтобы вызывать to_string с char, вы сначала выполняете трансляцию на int?

BoBTFish 15.08.2018 09:10

Фактически, когда вы даете значение int переменной char, это значение int обрабатывается как значение ascii или unicode неявно (в соответствии с кодировкой).

Mukarram Ishaq 15.08.2018 09:13
char y = 49; std::cout<<y<<std::endl; вывод 1 не 49
Mukarram Ishaq 15.08.2018 09:29

Если вы читали мой предыдущий комментарий, я предлагаю std::cout << std::to_string(y). Есть ли причина, по которой вы передаете на intвнутри вызов to_string? (Я вежливо пытаюсь предположить, что в этом нет необходимости, но может быть причина, о которой я не знаю.)

BoBTFish 15.08.2018 09:36

Да, вы правы, явное приведение к int в этом случае не нужно. Поскольку std::to_string() преобразует значение char в его значение ascii, а затем отображает значение ascii в виде строки.

Mukarram Ishaq 15.08.2018 10:05

Прежде всего, вы по сути печатаете символы со значениями от 0 до x. Если вы посмотрите здесь таблицу ascii: http://www.asciitable.com/, вы можете посмотреть на числовое значение символа и увидеть, что он представляет как char. Если он не может быть представлен, консоль распечатает его в виде квадратов, которые вы видите.

Теперь вы говорите, что хотите, чтобы ваш код был коротким и точным. Позвольте мне немного переделать это.

#include <iostream>
#include <string>
using namespace std;

string m(int x) {
    string returnVal;
    for (int i = 0; i < x; i++)
        returnVal += (char)i;
    return returnVal;
}

int main() {
    int input;
    cin >> input;
    cout << m(input) << endl;
    return 0;
}

Использование букв в качестве имен переменных - ужасная практика. Избегайте этого любой ценой. Назовите переменные интуитивно, чтобы они были самоописывающимися. Это важнее, чем наличие «короткого» и «точного» кода.

Что касается этого, вам не нужна дополнительная переменная, которую вы назвали Q. Вы можете напрямую преобразовать ее в тип char. Также по возможности избегайте использования {}. Это снижает сложность кода и повышает читаемость

Я не согласен с тем, чтобы избегать {} вокруг тела петли for. Несмотря на то, что это всего одна строка, использование согласованного макета кода делает весь проект более читабельным и затрудняет неверную интерпретацию размера тела цикла. Пробелы часто портятся, когда два человека с разными настройками редактора касаются файла, а фигурные скобки предлагают некоторую защиту от этого ухудшения читаемости. Использование скобок даже для однолинейного тела защищает от того, что кто-то случайно превратит его в многострочное тело, но не добавит подтяжки. Особенно, если это происходит из-за использования (плохо написанного) макроса.

BoBTFish 15.08.2018 09:04

Использование фигурных скобок для макетов многострочного кода, избегая их при макетах с одной строкой, не нарушает согласованности. В этом есть система. Кроме того, согласно исследованиям, с психологической точки зрения человека чтение кода с меньшим количеством фигурных скобок происходит быстрее и эффективнее, поскольку вам нужно отфильтровать меньше мусора, это стандарт кодирования, используемый многими программистами. Это преимущество более полезно в функциях со многими последовательными операторами if. Все стандартные редакторы C++ поддерживают это. Чтобы добавить к этому, любой стандартный код C++ должен быть заключен с двумя пробелами, а не с четырьмя.

Erik9631 15.08.2018 09:11

@ Erik9631 фактически соответствует стандарту кода, используемому на конкретном месте работы. Для большинства инструментов слияния и проверки кода это считается плохим, чтобы избежать закрывающих скобок в коде, разрешение конфликтов может быть более подвержено ошибкам. Все вопросы форматирования также соответствуют нормативам работодателя.

Swift - Friday Pie 15.08.2018 11:02

Другие вопросы по теме