Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / ..хм... а КАК? ...можно обрезать строку? / 25 сообщений из 39, страница 1 из 2
18.08.2005, 10:18
    #33222292
Andrey_Ohotin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
..хм... а КАК? ...можно обрезать строку?
))) ну снова я... )))) парни! мне нужно удалить ненужные пробелы в конце строки, считываемой из файла... я как-только не пробовал.. но ведь наверняка есть функция, которая просто обрезает строку по заданной длине?
...
Рейтинг: 0 / 0
18.08.2005, 10:27
    #33222313
JibSkeart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
..хм... а КАК? ...можно обрезать строку?
Andrey_Ohotin))) ну снова я... )))) парни! мне нужно удалить ненужные пробелы в конце строки, считываемой из файла... я как-только не пробовал.. но ведь наверняка есть функция, которая просто обрезает строку по заданной длине?

а что юзаете BC++ VC++ ?

а вообще наверное '/0'
...
Рейтинг: 0 / 0
18.08.2005, 10:38
    #33222340
Andrey_Ohotin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
..хм... а КАК? ...можно обрезать строку?
я юзаю VS... но я полагаю, что есть конкретная функция, чтобы обрезать определенное количество ненужных символов - за один раз... либо, если у кого есть, какие идеи - как это по другому - вручную сделать?
...
Рейтинг: 0 / 0
18.08.2005, 10:41
    #33222346
Andrey_Ohotin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
..хм... а КАК? ...можно обрезать строку?
Andrey_Ohotinя юзаю VS... но я полагаю, что есть конкретная функция, чтобы обрезать определенное количество ненужных символов - за один раз... либо, если у кого есть, какие идеи - как это по другому - вручную сделать?

то есть VC :)
...
Рейтинг: 0 / 0
18.08.2005, 11:30
    #33222525
redskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
..хм... а КАК? ...можно обрезать строку?
Andrey_Ohotin мне нужно удалить ненужные пробелы в конце строки

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
#include <string>
using namespace std;

string& trim_str(string& s);
string& trim_str(string& s)
{
	return s.erase(s.find_last_not_of(" ")+ 1 );
}

int main()
{
	string s;
	while(getline(cin, s) && !s.empty())
	{
		cout << "source: \"" << s << "\"\n";
		cout << "trimmed: \"" << trim_str(s) << "\"\n";
	}
	return  0 ;
}

Если MFCшный CString, то там еще проще - смотри методы:

Trim Trims all leading and trailing whitespace characters from the string.
TrimLeft Trims leading whitespace characters from the string.
TrimRight Trims trailing whitespace characters from the string.


наверняка есть функция, которая просто обрезает строку по заданной длине?

В STL
Код: plaintext
 basic_string::substr
В MFC
Код: plaintext
CString::Left
...
Рейтинг: 0 / 0
18.08.2005, 13:38
    #33223052
Andrey_Ohotin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
..хм... а КАК? ...можно обрезать строку?
... а я сделал это так... может коряво конечно.. )) но вручную.. работает!
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
int len, j= 0 ;
	   char buf[l_fio];		
		fgets(buf,l_fio,file);  //Считываем строку с Ф.И.О.
		 len = strlen(buf);					
		  int n = len;
		   char c;
		    while((c = buf[n- 1 ]) == ' ')  //Считаем кол-во пробелов от конца Ф.И.О.
		     {
			  j++;
			   n--;
		        }		
		        char temp;
		         int str_len = (len - j);
		          for(int i= 0 ;i<str_len;i++)
		           {
		        	temp = buf[i];
		             list.FIO[i] = temp;			
		              }		
		               list.FIO[len - j] =  0 ;	
...
Рейтинг: 0 / 0
18.08.2005, 14:40
    #33223228
roman10
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
..хм... а КАК? ...можно обрезать строку?
Andrey_Ohotin... а я сделал это так... может коряво конечно.. )) но вручную.. работает!
Тихий ужас :)

Чтобы обрезать строку, достаточно на место последнего пробела запихнуть '\0'. Соответсвенно, временный буфер не нужен, можно напрямую читать в list.FIO и править строку уже там. Кстати, в вашем коде ошибка: если будет введена строка из одних пробелов, то произойдет выход за границу массива.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
char* p;

fgets(buf,l_fio,file);
if (*buf) // убеждаемся, что строка ненулевой длины
{
    for (p = buf; *p; p++); // ищем конец строки
    p--; // слезаем с завершающего нуля
    while (isspace(*p) && p > buf) p--; // откатываемся до первого непробельного симовла
    *p = '\0'; // шлепаем ноль
}
...
Рейтинг: 0 / 0
18.08.2005, 17:36
    #33223817
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
..хм... а КАК? ...можно обрезать строку?
Вот так чуть правильнее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
char* p;

if (fgets(buf, sizeof(buf), file)) // убеждаемся, что вообще смогли что-то прочитать
{
    for (p = buf; *p && (p < (buf+sizeof(buf))); p++); // ищем конец строки
    p--; // слезаем с завершающего нуля
    while ((p >= buf) && isspace(*p)) p--; // откатываемся до первого непробельного симовла
    p++;       // ставим указатель на первый пробел
    *p =  0 ; // шлепаем ноль
}
...
Рейтинг: 0 / 0
18.08.2005, 17:54
    #33223865
roman10
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
..хм... а КАК? ...можно обрезать строку?
White OwlВот так чуть правильнее
Да, вы правы. В моем случае съедался последний символ строки. Что касается проверки p < (buf+sizeof(buf)), имхо она лишняя, так как если fgets отработала правильно (т.е. вернула не NULL), то строка гарантировано будет завершена нулевым символом.
...
Рейтинг: 0 / 0
18.08.2005, 18:32
    #33223953
Andrey_Ohotin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
..хм... а КАК? ...можно обрезать строку?
Большое всем спасибо!!!! )))) выручили.. у вас конечно красивей.. ))) нежели у меня..
...
Рейтинг: 0 / 0
18.08.2005, 19:54
    #33224058
q
q
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
..хм... а КАК? ...можно обрезать строку?
Код: plaintext
1.
2.
char str [..]
for(int x = strelen(str)- 1 ; x>= 0 ;--x)   if(' ' !=str[i]) break; else str [x] = '\0';
...
Рейтинг: 0 / 0
19.08.2005, 06:04
    #33224258
Карабас Барабас
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
..хм... а КАК? ...можно обрезать строку?
roman10если fgets отработала правильно (т.е. вернула не NULL), то строка гарантировано будет завершена нулевым
символом
Если переменная по логике работы программы никак не может принять какое-либо значение, то она его обязательно примет. (какой-то из
законов подлости)

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
19.08.2005, 14:50
    #33225481
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
..хм... а КАК? ...можно обрезать строку?
Из области программерских трюков. Для trim_left(char *s,int n)
можно вернуть s+n что есть достаточно быстро но не гарантирует
корректности работы софта, если s изменяется или уничтожается
раньше чем результат. Сам я такими штуками не пользуюсь, однако
есть много любителей....
...
Рейтинг: 0 / 0
19.08.2005, 16:06
    #33225728
Andrey_Ohotin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
..хм... а КАК? ...можно обрезать строку?
То есть эта функция обрезает строку s от начала и до значения переменной n? я Правильно понял?
...
Рейтинг: 0 / 0
19.08.2005, 18:33
    #33226114
q
q
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
..хм... а КАК? ...можно обрезать строку?
Andrey_OhotinТо есть эта функция обрезает строку s от начала и до значения переменной n? я Правильно понял?

Код: plaintext
1.
 memmove(str, str+n, <сам напиши а то мне лень>);
...
Рейтинг: 0 / 0
19.08.2005, 18:36
    #33226116
q
q
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
..хм... а КАК? ...можно обрезать строку?
memmove(str, str+n, strlen(str+n));
...
Рейтинг: 0 / 0
20.08.2005, 01:39
    #33226327
MidnightMover
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
..хм... а КАК? ...можно обрезать строку?
redskin

[src c++]
string& trim_str(string& s);
string& trim_str(string& s)
{
return s.erase(s.find_last_not_of(" ")+1);
}

Здесь разве не происходит возврат временного объекта по ссылке?
...
Рейтинг: 0 / 0
20.08.2005, 15:28
    #33226630
redskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
..хм... а КАК? ...можно обрезать строку?
MidnightMover redskin

Код: plaintext
1.
2.
3.
4.
5.
string& trim_str(string& s);
string& trim_str(string& s)
{
	return s.erase(s.find_last_not_of(" ")+ 1 );
}

Здесь разве не происходит возврат временного объекта по ссылке?


Неа, откуда он там?

MSDN
basic_string::erase

... (два варианта с параметрами итераторами поскпипаны)

basic_string& erase(
size_type _Pos = 0,
size_type _Count = npos
);

Return Value
For the third member function, a reference to the string object from which the elements have been erased.


наглядная иллюстрация:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
#include <iostream>

using namespace std;

class C
{
public:
	C() {cout << "C::ctor this = " << this << endl;}
	C(const C& c) {cout << "C::cctor this = " << this << endl;}
	~C() {cout << "dtor" << endl;}

	C& dummy()
	{
		cout << "C::dummy. this = " << this << endl;
		return *this;
	}
};

C& f_ref(C& ref)
{
	return ref.dummy();
}

C& f_val(C val)
{
	return val.dummy();
}

int main()
{
	{
		cout << "reference test" << endl;
		C c;
		f_ref(c);
		
	}
	
	{
		cout << endl << "value test" << endl;
		C c;
		f_val(c);
	}
	
	return  0 ;
}
...
Рейтинг: 0 / 0
20.08.2005, 16:32
    #33226645
redskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
..хм... а КАК? ...можно обрезать строку?
Хм, поспешил и в цитате из доки забыл существенную строчку:


Remarks
The third member function returns *this .


В стандарте (той копии драфта, которая есть под рукой) это п.21.3.5.5

А чтобы в примере было понятно что к чему, лучше изменить пару строк:

Код: plaintext
1.
2.
3.
4.
5.
6.
f_ref(c).dummy();

...

f_val(c).dummy();

...
Рейтинг: 0 / 0
22.08.2005, 19:07
    #33228779
Анн
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
..хм... а КАК? ...можно обрезать строку?
...
char str[Длина];
...
Обрезать строку до нужного символа

((char*)strchr(str,'символ'))[0] = NULL; // или 0
...
Рейтинг: 0 / 0
23.08.2005, 05:57
    #33229083
Карабас Барабас
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
..хм... а КАК? ...можно обрезать строку?
Анн((char*)strchr(str,'символ'))[0] = NULL; // или 0
А потом удивляемся, почему микрософт такой глючный
Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
23.08.2005, 10:13
    #33229269
JibSkeart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
..хм... а КАК? ...можно обрезать строку?
Карабас Барабас Анн((char*)strchr(str,'символ'))[0] = NULL; // или 0
А потом удивляемся, почему микрософт такой глючный
Posted via ActualForum NNTP Server 1.2


?
...
Рейтинг: 0 / 0
23.08.2005, 10:53
    #33229397
Карабас Барабас
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
..хм... а КАК? ...можно обрезать строку?
А что произойдет, если 'символ' никогда не встретится ?
Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
24.08.2005, 11:50
    #33231457
Анн
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
..хм... а КАК? ...можно обрезать строку?
Карабас Барабас
А что произойдет, если 'символ' никогда не встретится ?

Можно так:

if( ((char*)strchr(str,'символ')) != 0) ((char*)strchr(str,'символ'))[0] = 0;
...
Рейтинг: 0 / 0
24.08.2005, 11:51
    #33231463
Карабас Барабас
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
..хм... а КАК? ...можно обрезать строку?
и дважды пробежаться по строке скажем так 100 Мб длиной ...
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / ..хм... а КАК? ...можно обрезать строку? / 25 сообщений из 39, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]