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; }
откуда при копировании во вторую строку появляется помимо строки без пробелов безумное количество МММ и + исходная строка целиком? и как это исправить?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #1 : 16-03-2010 17:54 » |
|
признак того, что исполльзовал нетерминированную строку ) А где именно - ткни пальцем ? Лень же разбираться
|
|
|
Записан
|
|
|
|
BashOrgRu
Гость
|
|
« Ответ #2 : 16-03-2010 18:00 » |
|
strncpy(str2, str1+nb,min(n,n));
при прокрутке выдаёт что *МММ* появляется после этой строки, а если в начале не обнулять s2, то они и там будут... это вообще лаба такая, надо в исходном коде исправить вагон и маленькую тележку ошибок
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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
Молодой специалист
Offline
Пол:
|
|
« Ответ #5 : 16-03-2010 18:20 » |
|
Проблема (если это можно так назвать) решается если в alltrim после strncpy написать: str2[n] = 0;
Но мне вот тоже интересно, о какой "прокрутке" шла речь? И не мешало бы выделять код, чтоб он всё-таки читался как код, а не как обычный текст
|
|
|
Записан
|
|
|
|
BashOrgRu
Гость
|
|
« Ответ #6 : 16-03-2010 18:26 » |
|
вуху)) спасибо! теперь всё понятно =)
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #7 : 16-03-2010 18:28 » |
|
не копируешь zt, сделай так strncpy(str2, str1+nb,n+1);
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #8 : 16-03-2010 18:32 » |
|
Алексей1153++, если используешь stncpy, то в вопросах zt на нее лучше не полагаться If count is less than or equal to the length of strSource, a null character is not appended automatically to the copied string. BashOrgRu, о "прокрутке" так и не рассказала. Может ты владеешь какими-то тайными техниками "прокрутки", которые мне не известны (вообще не знаю что это). Я ведь тоже хочу знать и уметь
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #9 : 16-03-2010 18:34 » |
|
resource, не использую ) У меня есть memmove на этот случай, а с терминатором у меня всегда беседа отдельная. Но так со строками не часто приходится возиться
|
|
|
Записан
|
|
|
|
BashOrgRu
Гость
|
|
« Ответ #10 : 16-03-2010 18:39 » |
|
ну ё маё) хватит к словам придираться)) не прокрутка, отладка)
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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];
надолго не хватит
|
|
|
Записан
|
|
|
|
|