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

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

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

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

27.12.2010, 12:47. Просмотров 4672. Ответов 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");
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.12.2010, 12:47     Переворот строки
Посмотрите здесь:

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

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

Переворот строки рекурсией - 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++
Создать 2 объекта разработанного класса. Одной из компонент класса является динамическая символьная строка. В результате выполнения...

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

Переворот слов - C++
Дали такие задания: Задание 1 В строке, содержащей несколько слов, разделенных пробелом, перевернуть каждое слово. Входные...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 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
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 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
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 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
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
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 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
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++
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;sstream&gt; int main() { std::string input; std::getline( std::cin,...

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

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

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

Переворот столбец со словами - C++
Вечер добрый. Нужна помощь. Пользователь вводит имя файла, содержащего слова в столбик. Программа копирует все слова во второй файл,...


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

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

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