| 
			| 
					
						| 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 надолго не хватит |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	|  |