|
|
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)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.linux/25410482620e.html, оценка из 5, голосов 10
|