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