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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 35, средняя оценка - 4.83
Егорка47
7 / 6 / 1
Регистрация: 26.10.2010
Сообщений: 249
27.12.2010, 12:47     Переворот строки #1
Ребят,у меня есть 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");
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.12.2010, 12:47     Переворот строки
Посмотрите здесь:

Переворот строки C++
Переворот строки C++
C++ Переворот строки. Необработанное исключение. Нарушения прав доступа
Переворот масива C++
Переворот слов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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);
с учетом конца строки
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
27.12.2010, 12:52     Переворот строки #3
Егорка47,
b=strlen(str1)-1;
Дабы учитывать что отсчет начинается с нуля. strlen возвращает длину строки без завершающего нуль символа.
Это и ответ на второй вопрос, ибо мы должны всегда выделять на один символ больше.
Пример:
const char* s="Hello";
на самом деле s содержит в себе H, e, l, l, o, \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,
причем нулевой символ окончания (' ') в длину не зачитывается

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

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

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

Добавлено через 3 минуты
то есть есди у нас есть какое то предложение, то еще в начале стоит "0"?
"Hello" strlen вернет 7 (а у нас 6 символов) да еще и не считая ноль терминал?
запутался..
vx5
 Аватар для 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 в памяти тоже хранится, но это уже детали реализации, при простой работе со строками вам про это помнить не надо. Вспомнить придется только при работе с динамической памятью(как раз где используете +)
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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;
}
vx5
 Аватар для vx5
187 / 171 / 4
Регистрация: 04.09.2010
Сообщений: 656
27.12.2010, 13:48     Переворот строки #11
vx5, не сказал бы что только. Что выведет?
10 символов и 10 единиц мусора
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.12.2010, 13:50     Переворот строки
Еще ссылки по теме:

Переворот массива C++
C++ Переворот массива
C++ Переворот строки рекурсией

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
27.12.2010, 13:50     Переворот строки #12
vx5, Ну вот) Так что не только при динамическом распределении)
Yandex
Объявления
27.12.2010, 13:50     Переворот строки
Ответ Создать тему
Опции темы

Текущее время: 06:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru