Главная страница


ru.linux

 
 - RU.LINUX ---------------------------------------------------------------------
 From : Vladimir Bormotov                    2:5020/400     22 Dec 2002  16:04:20
 To : Den Gourkin
 Subject : Re: Обрезать начальные и конечные пробелы в строке...
 -------------------------------------------------------------------------------- 
 
 
    Hi, Den!
 
 >>>>> "DG" == Den Gourkin <Den.Gourkin@p33.f7.n5061.z2.fidonet.org> writes:
 
  AM>> Как осуществить сабж на Си?
  AM>> Строка содержит целое предложение так что sscanf("%s") не
  AM>> помогает. :(
  
  DG> ИМХО, стандартных средств для такой обработки строк нет, хотя, могу и
  DG> ошибаться.
  
  DG> Можешь сделать что-нить наподобие и оформить отдельной функцией:
 
  ага, только вот ему делать нужно СОВСЕМ другое.
  
  Hужно просканить строку с начала вперед, найти указатель на первый
  непробельный символа. Потом просканить строку с конца назад, и
  найти указатель на первый непробельный (с конца).
  
  А далее, strncat, начиная с разницы указателей начал строк (это будет
  индекс начала строки), и длиной, которая будет разницой указателей
  найденых символов.
  
  
  DG> === Cut ===
  DG> #include <stdio.h> include <string.h>
 
  DG> // ========================================================
  DG> int main() {
  DG>   char str[] = "    Просто   пример текстовой     строки    ";
  DG>   strlen(str); char str2[len];
 
  DG>   memset( str2, 0, sizeof(str2) );
 
  DG>   for( int i = 0; i < len; i++ ) {
  DG>     if( (str[i] == ' ') && (str[i + 1] == ' ') )
  DG>       continue;
  DG>     else if( (str[i] == ' ') && (str[i + 1] != ' ') )
  DG>       strcat( str2, " " );
  DG>     else if( str[i] != ' ' )
  DG>       strncat( str2, (char *)&str[i], 1 );
  DG>   } 
  DG>   printf("\nПриведенная строка: %s\n\n", str2);
 
  DG>   return 0;
  DG> } === Cut ===
 
 ws:~/c$ gcc -o strstrp strstrip.c 
 strstrip.c: In function `main':
 strstrip.c:13: parse error before `int'
 strstrip.c:13: `i' undeclared (first use in this function)
 strstrip.c:13: (Each undeclared identifier is reported only once
 strstrip.c:13: for each function it appears in.)
 strstrip.c:13: parse error before `)'
 strstrip.c: At top level:
 strstrip.c:22: parse error before string constant
 strstrip.c:22: warning: data definition has no type or storage class
 
  ...и эти люди мне говорят что Си это хороший язык.. ;))
  
  но кроме того, твоя функция оставляет по пробелу в начале и в конце.
  не говоря уже о том, что "срезает" двойные пробелы ВHУТРИ строки.
   
  Это очень хорошо видно, если printf записать в виде
  printf(" in:\"%s\"\nout:\"%s\"\n", str, str2);
 
 === out ==
 ws:~/c$ ./strstrp 
  in:"    Просто   пример текстовой     строки    "
 out:" Просто пример текстовой строки "
 ===
 
  to ЗащитникиСи: подумайте, сколько ЕЩЕ програмистов которые считают что
  "умеют писать на Си", выдают вот ТАКОЙ код?
  
  Я уж даже не спрашиваю ЗАЧЕМ им может быть нужен ПОШАГОВЫЙ ОТЛАДЧИК...
  
  Ужас!
  
  Внимание, правильынй ответ:
 
 === cut ===
 #include <stdio.h>
 #include <string.h>
 
 // ========================================================
 int main()
 {
   char str1[] = "    Просто   пример текстовой     строки    ";
   char str2[sizeof(str1)];
   char* pstr1;
   char* pstr2;
   int idx;
   int len_str1;
 
   memset(str2, 0, sizeof(str2));
 
   len_str1 = strlen(str1);
 
   for (idx = 0, pstr1 = str1; idx <= len_str1; idx++, pstr1++)
       if (*pstr1 != ' ') break;
 
   printf("first non space idx: %d\n", pstr1 - str1);
 
   for (idx = len_str1-1, pstr2 = str1+len_str1-1; idx >= 0; idx--, pstr2--)
       if (*pstr2 != ' ') break;
 
   printf("last non space idx: %d\n", pstr2 - str1);
 
   strncat(str2, pstr1, pstr2 - pstr1);
 
   printf(" in:\"%s\"\nout:\"%s\"\n", str1, str2);
 
   return 0;
 }
 === cut ===
 
  эхх...
  
 -- 
    Bor.
 --- ifmail v.2.15dev5
  * Origin: BorHomeLand (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Обрезать начальные и конечные пробелы в строке...   Andrew Martovlos   21 Dec 2002 21:01:51 
 Обрезать начальные и конечные пробелы в строке...   Den Gourkin   22 Dec 2002 12:23:38 
 Re: Обрезать начальные и конечные пробелы в строке...   Vladimir Bormotov   22 Dec 2002 16:04:20 
Архивное /ru.linux/25410482620e.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional