Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: удаление пробелов в начале и конце строки  (Прочитано 17515 раз)
0 Пользователей и 1 Гость смотрят эту тему.
BashOrgRu
Гость
« : 16-03-2010 17:49 » 

/* Назначение программы: Функция alltrim удаляет из строки
начальные и конечные пробелы и возвращает указатель на
преобразованную строку. Функция main вводит исходную строку,
обращается к функции alltrim и выводит преобразованную строку,
окаймленную звездочками */


#include <iostream >
#include <conio.h>
#include <string.h>

typedef char* STRING;//оператор описания, содержащий ключевое слово typedef,
               //определяет синоним  STRING для типа char*

using namespace std;
STRING  alltrim ( STRING, STRING );
void main(void)
{
   setlocale (LC_ALL, "rus");
   char s1[30], s2[30];
   *s2=0;
  system("cls");
  cout<<endl<<"Исходная строка:   ";
  cin.get(s1,sizeof(s1));            // или  gets ( s1 );
   alltrim(s2,s1);
  cout<<endl<<"Результирующая строка: *****"<<s2<<"*****";
  _getch();
}

// Функция alltrim удаляет из строки начальные и конечные пробелы
//и возвращает указатель на преобразованную строку.

STRING alltrim(STRING str2,STRING str1)
/*----------- Параметры ---------------
•   str2 - преобразованная строка
•   str1 - исходная строка
------------------------------------------------*/

{
int nb;  // Номер первого символа в строке, отличного от пробела
int ne; // Номер последнего символа в строке, отличного от пробела
int n;   // Длина выходной строки
int lstr1=strlen(str1);  // Длина входной строки
// Вычисление номера первого символа, отличного от пробела

        for (nb=0; nb<lstr1 && str1[nb] ==' '; nb++);
// Вычисление номера последнего символа, отличного от пробела
        for (ne=lstr1-1; ne>=0 && str1[ne] ==' '; ne--);
// Вычисление длины преобразованной строки
n=ne+1-nb;
strncpy(str2, str1+nb,min(n,n));
return str2;
}

откуда при копировании во вторую строку появляется помимо строки без пробелов безумное количество МММ и + исходная строка целиком? и как это исправить?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 16-03-2010 17:54 » 

признак того, что исполльзовал нетерминированную строку ) А где именно - ткни пальцем ? Лень же разбираться
Записан

BashOrgRu
Гость
« Ответ #2 : 16-03-2010 18:00 » new

strncpy(str2, str1+nb,min(n,n));

при прокрутке выдаёт что *МММ* появляется после этой строки, а если в начале не обнулять s2, то они и там будут...
это вообще лаба такая, надо в исходном коде исправить вагон и маленькую тележку ошибок
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 16-03-2010 18:07 » 

при какой прокрутке ?

кстати, min(n,n) -> n //всегда

ещё, ты уверена, что (str1+nb+n) и (str2+n) - не выйдет за границы массива ?

Аккуратнее с управлением памятью
« Последнее редактирование: 16-03-2010 18:28 от Алексей1153++ » Записан

BashOrgRu
Гость
« Ответ #4 : 16-03-2010 18:15 » 

ой, вот там где min(n,n) просто n, это я не оттуда скопировала)) а str1+nb+n точно не выходит за границы.
к примеру если писать *   привет!  * то с позиции 3 копируется 7 символов, и + откуда то появляются *ММММ   привет!*
причём количество ммм зависит от длины массива
Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 16-03-2010 18:20 » 

Проблема (если это можно так назвать) решается если в alltrim после strncpy написать: str2[n] = 0;

Но мне вот тоже интересно, о какой "прокрутке" шла речь?
И не мешало бы выделять код, чтоб он всё-таки читался как код, а не как обычный текст
Записан
BashOrgRu
Гость
« Ответ #6 : 16-03-2010 18:26 » 

вуху)) спасибо! теперь всё понятно =)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 16-03-2010 18:28 » 

не копируешь zt, сделай так
Код:
strncpy(str2, str1+nb,n+1);

Записан

resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 16-03-2010 18:32 » 

Алексей1153++, если используешь stncpy, то в вопросах zt на нее лучше не полагаться
Цитата: MSDN
If count is less than or equal to the length of strSource, a null character is not appended automatically to the copied string.

BashOrgRu, о "прокрутке" так и не рассказала. Может ты владеешь какими-то тайными техниками "прокрутки", которые мне не известны (вообще не знаю что это). Я ведь тоже хочу знать и уметь
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 16-03-2010 18:34 » 

resource, не использую ) У меня есть memmove на этот случай, а с терминатором у меня всегда беседа отдельная. Но так со строками не часто приходится возиться
Записан

BashOrgRu
Гость
« Ответ #10 : 16-03-2010 18:39 » 

ну ё маё) хватит к словам придираться)) не прокрутка, отладка)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 16-03-2010 18:43 » 

BashOrgRu, никто не придирается ) Реально загадка была
Записан

clearance
Гость
« Ответ #12 : 19-03-2010 05:58 » 

Код:
n=ne+1-nb;
strncpy(str2, str1+nb, n);
если одни пробелы передать, отрицательное n преобразуется в size_t

Код:
s2[30];
надолго не хватит
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines