Вывод части строки
c++
Есть ли простая команда для вывода части строки(ну или n первых символов)?
Может я перегрелся или еще что, но сколько не искал не нашел ничего простенького.
т.е. есть строка символов, мне нужно вытащить подстроку с n по k символа, где n
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Вывод части строки до определенного символа и после него
в чем суть, передо мной появилась задача: нужно написать программу которая выполняет операции над.

Как поделить консоль на 2 части: в верхней части вывод, в нижней — замена
Ребята, есть 2 функции, одна выводит, вторая меняет, нужно поделить консоль параллельно. В верхней.
Чтение через fscanf_s части строки с пробелом (и запись этой же строки)
нужно записать в файл строку, содержащую через табуляцию int, char, char, char, float, int. Далее.
2021 / 1620 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
1 2 3 4 5 6 7 8 9
#include #include int main() { std::string s = "abcdefg"; std::cout s.substr(0, 3) std::endl; return 0; }
![]()
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
если вывести то:
1 2 3 4
char s[80]; /// for( int i = 0; i 40; i++ ) printf("%c", s[i]);
А есть ли возможность вывода части строки на которую ссылается указатель?
т.е. есть к примеру строка «abcdefghijklmnopqrstuvwxyz», есть указатель на 5ый символ, как показать 6 символов с того места куда ссылается указатель?
p.s. просто требуется в задаче именно указателями на копии слов основной строки выдать результаты.
![]()
2890 / 1825 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
1 2 3 4 5 6 7 8 9 10 11 12 13 14
#include #include int main() { char str[BUFSIZ] = "abcdefghijklmnopqrstuvwxyz", *p = &str[4]; int i = 0; while(i strlen(str)) { printf("%c", *(p++)); ++i; } return 0; }
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Чтение из файла строки по началу строки или ее части
Всем доброго времени суток! Большая просьба помочь! поступило задание, сделать словарь. Вводишь.

Вывод дробной части
Всем привет. Проблема собственно такая, не получается вывести дробную часть стороны треугольника.
Вывод части матрицы
Напечатать таблицу, содержащую номера, фамилии и оценку студентов по высшей математике, а также.
Вывод целой и дробной части
"Вводятся числитель и знаменатель дроби. Вывести: знак, целую часть, сокращенные числитель и.
Ввод и вывод символьных строк в Си
Итак, строки в языке Си. Для них не предусмотрено отдельного типа данных, как это сделано во многих других языках программирования. В языке Си строка – это массив символов. Чтобы обозначить конец строки, используется символ ‘\0’ , о котором мы говорили в прошлой части этого урока. На экране он никак не отображается, поэтому посмотреть на него не получится.
Создание и инициализация строки
Так как строка – это массив символов, то объявление и инициализация строки аналогичны подобным операциям с одномерными массивами.
Следующий код иллюстрирует различные способы инициализации строк.
char str[10]; char str1[10] = ; char str2[10] = "Hello!"; char str3[] = "Hello!";

Рис.1 Объявление и инициализация строк
В первой строке мы просто объявляем массив из десяти символов. Это даже не совсем строка, т.к. в ней отсутствует нуль-символ \0 , пока это просто набор символов.
Вторая строка. Простейший способ инициализации в лоб. Объявляем каждый символ по отдельности. Тут главное не забыть добавить нуль-символ \0 .
Третья строка – аналог второй строки. Обратите внимание на картинку. Т.к. символов в строке справа меньше, чем элементов в массиве, остальные элементы заполнятся \0 .
Четвёртая строка. Как видите, тут не задан размер. Программа его вычислит автоматически и создаст массив символов нужный длины. При этом последним будет вставлен нуль-символ \0 .
Как вывести строку
Дополним код выше до полноценной программы, которая будет выводить созданные строки на экран.
#include int main(void) < char str[10]; char str1[10] = ; char str2[10] = "Hello!"; char str3[] = "Hello!"; for(int i = 0; i

Рис.2 Различные способы вывода строки на экран
Как видите, есть несколько основных способов вывести строку на экран.
- использовать функцию printf со спецификатором %s
- использовать функцию puts
- использовать функцию fputs , указав в качестве второго параметра стандартный поток для вывода stdout .
Единственный нюанс у функций puts и fputs . Обратите внимание, что функция puts переносит вывод на следующую строку, а функция fputs не переносит.
Как видите, с выводом всё достаточно просто.
Ввод строк
С вводом строк всё немного сложнее, чем с выводом. Простейшим способом будет являться следующее:
#include int main(void)
Функция gets приостанавливает работу программы, читает строку символов, введенных с клавиатуры, и помещает в символьный массив, имя которого передаётся функции в качестве параметра.
Завершением работы функции gets будет являться символ, соответствующий клавише ввод и записываемый в строку как нулевой символ.
Заметили опасность? Если нет, то о ней вас любезно предупредит компилятор. Дело в том, что функция gets завершает работу только тогда, когда пользователь нажимает клавишу ввод. Это чревато тем, что мы можем выйти за рамки массива, в нашем случае — если введено более 20 символов.
К слову, ранее ошибки переполнения буфера считались самым распространенным типом уязвимости. Они встречаются и сейчас, но использовать их для взлома программ стало гораздо сложнее.
Итак, что мы имеем. У нас есть задача: записать строку в массив ограниченного размера. То есть, мы должны как-то контролировать количество символов, вводимых пользователем. И тут нам на помощь приходит функция fgets :
#include int main(void)
Функция fgets принимает на вход три аргумента: переменную для записи строки, размер записываемой строки и имя потока, откуда взять данные для записи в строку, в данном случае — stdin . Как вы уже знаете из 3 урока, stdin – это стандартный поток ввода данных, обычно связанный с клавиатурой. Совсем необязательно данные должны поступать именно из потока stdin , в дальнейшем эту функцию мы также будем использовать для чтения данных из файлов.
Если в ходе выполнения этой программы мы введем строку длиннее, чем 10 символов, в массив все равно будут записаны только 9 символов с начала и символ переноса строки, fgets «обрежет» строку под необходимую длину.
Обратите внимание, функция fgets считывает не 10 символов, а 9 ! Как мы помним, в строках последний символ зарезервирован для нуль-символа.
Давайте это проверим. Запустим программу из последнего листинга. И введём строку 1234567890 . На экран выведется строка 123456789 .

Рис.3 Пример работы функции fgets
Возникает вопрос. А куда делся десятый символ? А я отвечу. Он никуда не делся, он остался в потоке ввода. Выполните следующую программу.
#include int main(void)
Вот результат её работы.

Рис.4 Непустой буфер stdin
Поясню произошедшее. Мы вызвали функцию fgets . Она открыла поток ввода и дождалась пока мы введём данные. Мы ввели с клавиатуры 1234567890\n ( \n я обозначаю нажатие клавиша Enter ). Это отправилось в поток ввода stdin . Функция fgets , как и полагается, взяла из потока ввода первые 9 символов 123456789 , добавила к ним нуль-символ \0 и записала это в строку str . В потоке ввода осталось ещё 0\n .
Далее мы объявляем переменную h . Выводим её значение на экран. После чего вызываем функцию scanf . Тут-то ожидается, что мы можем что-то ввести, но т.к. в потоке ввода висит 0\n , то функция scanf воспринимает это как наш ввод, и записывается 0 в переменную h . Далее мы выводим её на экран.
Это, конечно, не совсем такое поведение, которое мы ожидаем. Чтобы справиться с этой проблемой, необходимо очистить буфер ввода после того, как мы считали из него строку, введённую пользователем. Для этого используется специальная функция fflush . У неё всего один параметр – поток, который нужно очистить.
Исправим последний пример так, чтобы его работа была предсказуемой.
#include int main(void) < char str[10]; fgets(str, 10, stdin); fflush(stdin); // очищаем поток ввода puts(str); int h = 99; printf("do %d\n", h); scanf("%d",&h); printf("posle %d\n", h); return 0; >
Теперь программа будет работать так, как надо.

Рис.4 Сброс буфера stdin функцией fflush
Подводя итог, можно отметить два факта. Первый. На данный момент использование функции gets является небезопасным, поэтому рекомендуется везде использовать функцию fgets .
Второй. Не забывайте очищать буфер ввода, если используете функцию fgets .
На этом разговор о вводе строк закончен. Идём дальше.
Сохрани в закладки или поддержи проект.
Практика
Решите предложенные задачи:

Для удобства работы сразу переходите в полноэкранный режим
Исследовательские задачи для хакеров
- Проверьте как ведет себя ваш компилятор в случае переполнения буфера.
Дополнительные материалы
- пока нет
Вывод части строки между определнными позициями символов c++
Есть строка, в ней, к прмеру, 100 символов, но необходимо вывести только часть строки между 30 и 70 символом, как такое сделать на c++?
Отслеживать Сортировка: Сброс на вариант по умолчанию Не делал банальных проверок на ввод некорректных чисел, с этим вы уже сами справитесь. Отслеживать Лента вопроса Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS. Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.10.27.43697 Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie. Строка — это последовательность ASCII или UNICODE символов. Строки в C, как и в большинстве языков программирования высокого уровня рассматриваются как отдельный тип, входящий в систему базовых типов языка. Так как язык C по своему происхождению является языком системного программирования, то строковый тип данных в C как таковой отсутствует, а в качестве строк в С используются обычные массивы символов. Исторически сложилось два представления формата строк: Формат ANSI устанавливает, что значением первой позиции в строке является ее длина, а затем следуют сами символы строки. Например, представление строки «Моя строка!» будет следующим: 11 ‘М’ ‘о’ ‘я’ ‘ ‘ ‘с’ ‘т’ ‘р’ ‘о’ ‘к’ ‘а’ ‘!’ ‘М’ ‘о’ ‘я’ ‘ ‘ ‘с’ ‘т’ ‘р’ ‘о’ ‘к’ ‘а’ ‘!’ 0 Строки реализуются посредством массивов символов. Поэтому объявление ASCII строки имеет следующий синтаксис: char имя[длина]; Строковый литерал – строка ASCII символов заключенных в двойные кавычки. Примеры объявления строк с инициализацией: char str1[20] = «Введите значение: «, str2[20] = «»; const char message[] = «Сообщение об ошибке!»; Так как строки на языке С являются массивами символов, то к любому символу строки можно обратиться по его индексу. Для этого используется синтаксис обращения к элементу массива, поэтому первый символ в строке имеет индекс ноль. Например, в следующем фрагменте программы в строке str осуществляется замена всех символов ‘a’ на символы ‘A’ и наоборот. for(int i = 0; str[i] != 0; i++) Объявление массивов строк в языке С также возможно. Для этого используются двумерные массивы символов, что имеет следующий синтаксис: Первым размером матрицы указывается количество строк в массиве, а вторым – максимальная (с учетом завершающего нуля) длина каждой строки. Например, объявление массива из пяти строк максимальной длиной 30 значащих символов будет иметь вид: При объявлении массивов строк можно производить инициализацию: Число строковых литералов должно быть меньше или равно количеству строк в массиве. Если число строковых литералов меньше размера массива, то все остальные элементы инициализируются пустыми строками. Длина каждого строкового литерала должна быть строго меньше значения длины строки (для записи завершающего нуля). char days[12][10] = < При объявлении массивов строк с инициализацией допускается не указывать количество строк в квадратных скобках. В таком случае, количество строк в массиве будет определено автоматически по числу инициализирующих строковых литералов. char days[][12] = < Все библиотечные функции, предназначенные для работы со строками, можно разделить на три группы: Для ввода и вывода строковой информации можно использовать функции форматированного ввода и вывода (printf и scanf). Для этого в строке формата при вводе или выводе строковой переменной необходимо указать спецификатор типа %s. Например, ввод и последующий вывод строковой переменной будет иметь вид: char str[31] = «»; Недостатком функции scanf при вводе строковых данных является то, что символами разделителями данной функции являются: Поэтому, используя данную функцию невозможно ввести строку, содержащую несколько слов, разделенных пробелами или табуляциями. Например, если в предыдущей программе пользователь введет строку: «Сообщение из нескольких слов», то на экране будет выведено только «Сообщение». Функция gets предназначена для ввода строк и имеет следующий заголовок: Между тем использовать функцию gets категорически не рекомендуется, ввиду того, что она не контролирует выход за границу строки, что может произвести к ошибкам. Вместо нее используется функция fgets с тремя параметрами: char * fgets(char * buffer, int size, FILE * stream); где buffer — строка для записи результата, size — максимальное количество байт, которое запишет функция fgets, stream — файловый объект для чтения данных, для чтения с клавиатуры нужно указать stdin. Эта функция читает символы со стандартного ввода, пока не считает n — 1 символ или символ конца строки, потом запишет считанные символы в строку и добавит нулевой символ. При этом функция fgets записывает в том символ конца строки в данную строку, что нужно учитывать. Функция puts предназначена для вывода строк и имеет следующий заголовок: Простейшая программа: ввод и вывод строки с использованием функций fgets и puts будет иметь вид: char str[102] = «»; Для считывания одного символа можно использовать функцию fgetc(FILE * stream) . Она считывает один символ и возвращает значение этого символа, преобразованное к типу int, если же считывание не удалось, то возвращается специальная константа EOF, равная -1. Функция возвращает значение -1 для того, чтобы можно было обрабатывать ситуацию конца файла, посимвольное чтение до конца файла можно реализовать следующим образом: int c; Для вывода одного символа можно использовать функцию int fputc(int c, FILE *stream); . Помимо функций ввода и вывода в потоки в библиотеке stdio.h присутствуют функции форматированного ввода и вывода в строки. Функция форматированного ввода из строки имеет следующий заголовок: int sscanf(const char * restrict buffer, const char * restrict string, [address] . ); Функции форматированного вывода в строку имеют следующие заголовки: int sprintf(char * restrict buffer, В С для преобразования строк, содержащих числа, в численные значения в библиотеке stdlib.h Корректное представление вещественного числа в текстовой строке должно удовлетворять формату: После символов E, e указывается порядок числа. Корректное представление целого числа в текстовой строке должно удовлетворять формату: Помимо приведенных выше функций в библиотеке stdlib.h доступны также следующие функции преобразования строк в вещественные числа: float strtof(const char * restrict string, char ** restrict endptr); Аналогичные функции присутствуют и для преобразования строк в целочисленные значения: long int strtol(const char * restrict string, char ** restrict endptr, int base); Функции обратного преобразования (численные значения в строки) в библиотеке stdlib.h присутствуют, но они не регламентированы стандартом, и рассматриваться не будут. Для преобразования численных значений в строковые наиболее удобно использовать функции sprintf и snprintf. В библиотеке string.h содержаться функции для различных действий над строками. char str[] = «1234»; Функции копирования строк: char * strcpy(char * restrict dst, const char * restrict src); Функции сравнения строк: int strcmp(const char *string1, const char *string2); Функции осуществляют сравнение строк по алфавиту и возвращают: положительное значение – если string1 больше string2; Функции объединения (конкатенации) строк: char * strcat(char * restrict dst, const char * restrict src); Функции поиска символа в строке: char * strchr(const char *string, int c); Функция поиска строки в строке: char str[] = «Строка для поиска»; Функция поиска первого символа в строке из заданного набора символов: Функции поиска первого символа в строке не принадлежащему заданному набору символов: Функции поиска первого символа в строке из заданного набора символов: Функция поиска следующего литерала в строке:
задан 23 мар 2022 в 19:14
15 3 3 бронзовых знака
` std::cout << std::string_view( str + 30, (70-30) ) <#include using namespace std; int main() < char str[256] = "Output part of a string between certain character positions c++"; int first = 0; int last = 0; cin >> first >> last; for (int i = first; i < last; i++) < cout >
ответ дан 23 мар 2022 в 19:29
1,231 1 1 золотой знак 4 4 серебряных знака 16 16 бронзовых знаков
Важное на Мете
Похожие
Подписаться на ленту
Строки в языке C
В строках с завершающим нулем, значащие символы строки указываются с первой позиции, а признаком завершения строки является значение ноль. Представление рассмотренной ранее строки в этом формате имеет вид:Объявление строк в C
Объявление строки в С имеет тот же синтаксис, что и объявление одномерного символьного массива. Длина строки должна представлять собой целочисленное значение (в стандарте C89 – константа, в стандарте C99 может быть выражением). Длина строки указывается с учетом одного символа на хранение завершающего нуля, поэтому максимальное количество значащих символов в строке на единицу меньше ее длины. Например, строка может содержать максимально двадцать символов, если объявлена следующим образом:
char str[21]; Инициализация строки в С осуществляется при ее объявлении, используя следующий синтаксис:
char str[длина] = строковый литерал;Работа со строками в С
if (str[i] == ‘a’) str[i] = ‘A’;
else if (str[i] == ‘A’) str[i] = ‘a’;
>Массивы строк в С
char имя[количество][длина];
char имя[количество][длина] = ;
«Январь», «Февраль», «Март», ”Апрель», «Май»,
«Июнь», «Июль», «Август», «Сентябрь»,»Октябрь»,
«Ноябрь», «Декабрь»
>;
Например, массив из семи строк:
«Понедельник», «Вторник», «Среда», «Четверг»,
«Пятница», «Суббота», «Воскресенье»
>;Функции для работы со строками в С
Ввод и вывод строк в С
printf(«Введите строку: «);
scanf(«%30s”,str);
printf(«Вы ввели: %s”,str);
Для ввода и вывода строк в библиотеке stdio.h содержатся специализированные функции gets и puts.
char * gets(char *buffer);
int puts(const char *string);
printf(«Введите строку: «);
fgets(str, 102, stdin);
printf(«Вы ввели: «);
puts(str);
while ((c = fgetc(stdin)) != EOF) // Обработка символа
>
const char * restrict format, [argument] . );
int snprintf(char * restrict buffer, size_t maxsize,
const char * restrict format, [argument] . );Преобразование строк
предусмотрен следующий набор функций:
double atof(const char *string); // преобразование строки в число типа double
int atoi(const char *string); // преобразование строки в число типа int
long int atol(const char *string); // преобразование строки в число типа long int
long long int atoll(const char *string); // преобразование строки в число типа long long int
double strtod(const char * restrict string, char ** restrict endptr);
long double strtold(const char * restrict string,char ** restrict endptr);
unsigned long strtoul(const char * restrict string,
char ** restrict endptr, int base);
long long int strtoll(const char * restrict string,
char ** restrict endptr, int base);
unsigned long long strtoull(const char * restrict string,char ** restrict endptr, int base);Обработка строк
Функция вычисления длины строки:
size_t strlen(const char *string);
int n = strlen(str); //n == 4
char * strncpy(char * restrict dst, const char * restrict src, size_t num);
int strncmp(const char *string1, const char *string2,size_t num);
отрицательное значение – если string1 меньше string2;
нулевое значение – если string1 совпадает с string2;
char * strncat(char * restrict dst, const char * restrict src, size_t num);
char * strrchr(const char *string, int c);
char * strstr(const char *str, const char *substr);
char *str1 = strstr(str,»для»); //str1 == «для поиска»
size_t strcspn(const char *str, const char *charset);
size_t strspn(const char *str, const char *charset);
char * strpbrk(const char *str, const char *charset);
char * strtok(char * restrict string, const char * restrict charset);