С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/50: Рейтинг темы: голосов - 50, средняя оценка - 4.62
7 / 6 / 0
Регистрация: 26.10.2010
Сообщений: 249

Переворот строки

27.12.2010, 12:47. Показов 9899. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребят,у меня есть 2 часа чтоб понять!УМОЛЯЮ, помогите...объясните в этой функции( которая переворачивает строку и читатет ее) строку
b=strlen(str1)-1;
почему - 1??

str2=(char*)calloc(strlen(str1)+1,1);
а тут почему + 1??

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
void reverse(char *str1,char *signs)        //передаем в функцию исходную строку и разделительные символы
{
int i,n,a,b;
char *str2,*tmp;
str2=(char*)calloc(strlen(str1)+1,1);       //выделяем кусок памяти под строку
b=strlen(str1)-1;               //номер конечного элемента
do {
tmp=(char*)calloc(strlen(str1),1); 
for(i=b;i>=0;i--) {             //ищем конец слова и запоминаем его в переменной а
if(check_signs(str1[i],signs)) {
a=i;
break;
}
else continue;
}
for(i=a;i>=0;i--) {             //теперь ищем начало слова и запоминаем его в переменной b
if(check_signs(str1[i],signs)==0) {          //если под номером i разделитель
b=i+1;
break;
}
else
if((i==0)&(check_signs(str1[i],signs)!=0)) {       //если под номером i начало строки но не разделитель
b=i;
break;
}
else continue;
}
n=a-b+1;
memcpy(tmp,&str1[b],n);
strcat(str2,tmp);           //собираем новую строку
strcat(str2," ");
b=b-1;
free(tmp);
}
while(i!=0);
printf("\nNew string:\n\n");        //выводим новую строку
for (i=0;i<strlen(str2)-1;i++)
printf("%c",*(str2+i));
printf("\n");
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.12.2010, 12:47
Ответы с готовыми решениями:

Переворот строки
Почему при использовании указателя ошибка, а при использование массива всё нормально? void RevStr(char *str){ char *start,*end; ...

Переворот строки
Добрый вечер. Нужно перевернуть строку 12345 в 54321. Подскажите, где неверно в коде. Если можно не кодом, а словами (идеей), чтобы...

Переворот строки
Реализуйте класс ReversibleString, хранящий строку и поддерживающий методы Reverse для переворота строки и ToString для получения строки. ...

11
55 / 59 / 14
Регистрация: 26.11.2010
Сообщений: 192
27.12.2010, 12:50
C++
1
b=strlen(str1)-1;
размер строки без учета нолевого символа, т.е. конца строки

C++
1
str2=(char*)calloc(strlen(str1)+1,1);
с учетом конца строки
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
27.12.2010, 12:52
Егорка47,
b=strlen(str1)-1;
Дабы учитывать что отсчет начинается с нуля. strlen возвращает длину строки без завершающего нуль символа.
Это и ответ на второй вопрос, ибо мы должны всегда выделять на один символ больше.
Пример:
const char* s="Hello";
на самом деле s содержит в себе H, e, l, l, o, \0.
0
7 / 6 / 0
Регистрация: 26.10.2010
Сообщений: 249
27.12.2010, 12:55  [ТС]
то есть ноль терминал?
вот когда у меня спроили,я так и сказал - но это вроде не правильно!т. к. strlen возвращает длину строки без нуля терминала!!!

Описание функций C (Си) / C++ - strlen

int strlen(string);
char *string; строка, заканчивающаяся нулевым
символом

Описание.

Функция strlen возвращает в байтах длину строки string,
причем нулевой символ окончания (' ') в длину не зачитывается

так что тогда это?
функция работает вроде правильно..
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
27.12.2010, 12:58
\0 strlen не учитывает. а -1, дабы учитывать, что индексы в массивах С/С++ начинаются с нуля. То есть если строка состоит из 5 символов strlen вернет 5, но при этом ласт символ в массиве имеет номер 4, не считая нулл символа
0
7 / 6 / 0
Регистрация: 26.10.2010
Сообщений: 249
27.12.2010, 12:59  [ТС]
ForEveR, не понял..

Цитата Сообщение от ForEveR Посмотреть сообщение
ибо мы должны всегда выделять на один символ больше.
почему тогда мы вычитаем единицу?
или вы про эту строку?

Цитата Сообщение от Егорка47 Посмотреть сообщение
str2=(char*)calloc(strlen(str1)+1,1);
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
27.12.2010, 13:00
Егорка47, Именно про ту строку. Там где память выделяется. Почему вычитаем - ответ выше.
1
7 / 6 / 0
Регистрация: 26.10.2010
Сообщений: 249
27.12.2010, 13:15  [ТС]
Цитата Сообщение от ForEveR Посмотреть сообщение
о при этом ласт символ в массиве имеет номер 4, не считая нулл символа
извините,но я не понимаю..можете как нибудь проще объяснить?

Добавлено через 3 минуты
то есть есди у нас есть какое то предложение, то еще в начале стоит "0"?
"Hello" strlen вернет 7 (а у нас 6 символов) да еще и не считая ноль терминал?
запутался..
0
 Аватар для vx5
191 / 175 / 12
Регистрация: 04.09.2010
Сообщений: 656
27.12.2010, 13:26
строка - обычный массив символов. В массиве первый символ имеет порядковый номер 0, соответственно пятый символ имеет порядковый номер 4, а длина строки при этом будет равна 5(символ с индексом 0 , с индексом 1.. с индексом 4). Там где вычитание, вы находите индекс последнего элемента строки.

Добавлено через 2 минуты
то есть есди у нас есть какое то предложение, то еще в начале стоит "0"?
"Hello" strlen вернет 7 (а у нас 6 символов) да еще и не считая ноль терминал?
запутался..
если strlen вернет 7, значи ту нас 7 символов и есть, но так, как индекс первого элемента это ноль(а нам привычнее считать с единицы), индекс седьмого элемента будет 6.

Добавлено через 5 минут
символ \0 в памяти тоже хранится, но это уже детали реализации, при простой работе со строками вам про это помнить не надо. Вспомнить придется только при работе с динамической памятью(как раз где используете +)
1
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
27.12.2010, 13:33
vx5, не сказал бы что только. Что выведет?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
void foo(char* one)
{
    const int n=10;
    int i=0;
    for(i=0; i<n; ++i)
        one[i]=static_cast<char>('a'+i);
}
 
int main()
{
    const int n=20;
    char arr[n];
    foo(arr);
    std::cout<<arr<<'\n';
    return 0;
}
1
 Аватар для vx5
191 / 175 / 12
Регистрация: 04.09.2010
Сообщений: 656
27.12.2010, 13:48
vx5, не сказал бы что только. Что выведет?
10 символов и 10 единиц мусора
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
27.12.2010, 13:50
vx5, Ну вот) Так что не только при динамическом распределении)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.12.2010, 13:50
Помогаю со студенческими работами здесь

Выборочный переворот строки
Доброго дня! Хочу написать программу, которая на входных данных получает строку, в которой фраза с обычным порядком букв, но в квадратных...

Переворот строки рекурсией
Всем привет! В книге Герберта Шилдта &quot;C++ Шаг за шагом&quot; глава: Рекурсии есть такой пример: //Переворот строки рекурсией #include...

Переворот строки. Необработанное исключение. Нарушения прав доступа
void turn(char c, int step, int size) { if(step &lt; size&gt;&gt;1) { char temp = c; char temp2 = c; c =...

Переворот строки, не используя временные переменные и не осуществляя полного прохода по всей строке
У вас есть переменная std::string str = &quot;abcdefghijklmop&quot;;Напишите код переворота строки, не используя временные переменные и не...

реверсивный переворот
Создать 2 объекта разработанного класса. Одной из компонент класса является динамическая символьная строка. В результате выполнения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru