ниже мой код
#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;
}
но это мой вывод, что это за странно выглядящие квадратные символы.

Строку не следует печатать, потому что на каждой итерации добавляется символ.
Кроме того, пересмотрите возможность использования того, что часто считается плохой практикой: using namespace std; и endl (это ссылки на объяснения).
но я не видел этих символов раньше
Забавные квадраты - это, по сути, отказ вашего терминала: «этот символ, который вы хотите, чтобы я напечатал, - это какой-то непечатаемый мусор, поэтому здесь вместо него фиктивный символ». Если вы хотите распечатать числа, то есть 123456789101112131415..., см. Ответ acraig5075.
@BoBTFish Я согласен, но вся цель - сделать код как можно короче и точнее.
«Короткий» и «точный» - два совершенно не связанных между собой идеала. Укорочение кода часто затрудняет его понимание (по крайней мере, для человека), поэтому становится менее «точным» в том смысле, что точное предполагаемое значение не передается эффективно. endl менее точен, чем '\n', потому что он делает дополнительные вещи, которых вы, вероятно, не ожидали, и содержит точно такое же количество символов.
Если значение x не соответствует значению ASCII печатаемого символа, вы получите вот что!
Отредактируйте свой вопрос и скажите, что вы ожидаете увидеть. «12345 ...» или «abcde ...». В настоящее время ваш вопрос непонятен.
@BoBTFish не менее 32. Или 20ч. 32 - это пробел, все символы под ним не печатаются (теоретически), потому что имеют особое значение. На практике некоторые из них имеют визуальное представление.





Строки - это строки, а целые числа - это целые числа. Не путайте их и не ждите волшебства.
Попробуй это:
h += std::to_string(q);
@paxbun Это полностью причина проблемы, решение которой acraig5075 предлагает (на основе разумного предположения, что спрашивающий действительно хотел распечатать числа, а не представленные символы - это не совсем ясно из вопроса).
@BoBTFish Я не видел комментариев. Кстати, свой комментарий я удалил одновременно с вашим ответом, как я понял. Содержимое было «q is char, что означает, что h + = q эквивалентно h.push_back (q)».
Ваш терминал, вероятно, пытается интерпретировать строку как 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?
Потому что я думаю, что он хочет печатать числа через строку. Таким образом, char требует явного преобразования в int перед конкатенацией со строкой.
Я согласен с вашей интерпретацией вопроса, но почему вы думаете, что char c = 5; std::to_string(c); не работает? Т.е. вместо того, чтобы вызывать to_string с char, вы сначала выполняете трансляцию на int?
Фактически, когда вы даете значение int переменной char, это значение int обрабатывается как значение ascii или unicode неявно (в соответствии с кодировкой).
char y = 49; std::cout<<y<<std::endl; вывод 1 не 49
Если вы читали мой предыдущий комментарий, я предлагаю std::cout << std::to_string(y). Есть ли причина, по которой вы передаете на intвнутри вызов to_string? (Я вежливо пытаюсь предположить, что в этом нет необходимости, но может быть причина, о которой я не знаю.)
Да, вы правы, явное приведение к int в этом случае не нужно. Поскольку std::to_string() преобразует значение char в его значение ascii, а затем отображает значение ascii в виде строки.
Прежде всего, вы по сути печатаете символы со значениями от 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. Несмотря на то, что это всего одна строка, использование согласованного макета кода делает весь проект более читабельным и затрудняет неверную интерпретацию размера тела цикла. Пробелы часто портятся, когда два человека с разными настройками редактора касаются файла, а фигурные скобки предлагают некоторую защиту от этого ухудшения читаемости. Использование скобок даже для однолинейного тела защищает от того, что кто-то случайно превратит его в многострочное тело, но не добавит подтяжки. Особенно, если это происходит из-за использования (плохо написанного) макроса.
Использование фигурных скобок для макетов многострочного кода, избегая их при макетах с одной строкой, не нарушает согласованности. В этом есть система. Кроме того, согласно исследованиям, с психологической точки зрения человека чтение кода с меньшим количеством фигурных скобок происходит быстрее и эффективнее, поскольку вам нужно отфильтровать меньше мусора, это стандарт кодирования, используемый многими программистами. Это преимущество более полезно в функциях со многими последовательными операторами if. Все стандартные редакторы C++ поддерживают это. Чтобы добавить к этому, любой стандартный код C++ должен быть заключен с двумя пробелами, а не с четырьмя.
@ Erik9631 фактически соответствует стандарту кода, используемому на конкретном месте работы. Для большинства инструментов слияния и проверки кода это считается плохим, чтобы избежать закрывающих скобок в коде, разрешение конфликтов может быть более подвержено ошибкам. Все вопросы форматирования также соответствуют нормативам работодателя.
Как вы думаете, как будет выглядеть печать символьного представления целого числа
17(например)? Взгляните на этот Таблица ASCII и посмотрите, каковы числовые значения для «нормальных» символов. Обратите внимание, что ни один из них не меньше 23.