Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 35, средняя оценка - 4.83
Егорка47
7 / 6 / 1
Регистрация: 26.10.2010
Сообщений: 249
#1

Переворот строки - C++

27.12.2010, 12:47. Просмотров 4875. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.12.2010, 12:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Переворот строки (C++):

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

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

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

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

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

Переворот массива - C++
Как переворачивают не обычных массив, а двухмерный ? К примеру 4x4 ?

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

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

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

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

Описание.

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

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

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

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

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

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

Добавлено через 5 минут
символ \0 в памяти тоже хранится, но это уже детали реализации, при простой работе со строками вам про это помнить не надо. Вспомнить придется только при работе с динамической памятью(как раз где используете +)
1
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
27.12.2010, 13:33 #10
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
187 / 171 / 4
Регистрация: 04.09.2010
Сообщений: 656
27.12.2010, 13:48 #11
vx5, не сказал бы что только. Что выведет?
10 символов и 10 единиц мусора
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
27.12.2010, 13:50 #12
vx5, Ну вот) Так что не только при динамическом распределении)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.12.2010, 13:50
Привет! Вот еще темы с ответами:

Переворот масива - C++
Здравствуйте. Помагите пожалучто, у меня как то криво масив переворачиваетса... #include &lt;iostream&gt; #include &lt;ctime&gt; using namespace...

Переворот массива - C++
Как перевернуть массив на 180 градусов ? Помогите. Сам массив уже есть: #include &lt;iostream&gt; #include &lt;time.h&gt; #include...

Двойной переворот - C++
помогите переписать на c++, это Delphi. {$APPTYPE CONSOLE} uses SysUtils; var x:array of word; n,i,a,b,c,d:word;

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


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

Или воспользуйтесь поиском по форуму:
12
Yandex
Объявления
27.12.2010, 13:50
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru