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

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

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

то есть VC :)
...
Рейтинг: 0 / 0
..хм... а КАК? ...можно обрезать строку?
    #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
..хм... а КАК? ...можно обрезать строку?
    #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
..хм... а КАК? ...можно обрезать строку?
    #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
..хм... а КАК? ...можно обрезать строку?
    #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
..хм... а КАК? ...можно обрезать строку?
    #33223865
roman10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlВот так чуть правильнее
Да, вы правы. В моем случае съедался последний символ строки. Что касается проверки p < (buf+sizeof(buf)), имхо она лишняя, так как если fgets отработала правильно (т.е. вернула не NULL), то строка гарантировано будет завершена нулевым символом.
...
Рейтинг: 0 / 0
..хм... а КАК? ...можно обрезать строку?
    #33223953
Andrey_Ohotin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое всем спасибо!!!! )))) выручили.. у вас конечно красивей.. ))) нежели у меня..
...
Рейтинг: 0 / 0
..хм... а КАК? ...можно обрезать строку?
    #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
..хм... а КАК? ...можно обрезать строку?
    #33224258
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roman10если fgets отработала правильно (т.е. вернула не NULL), то строка гарантировано будет завершена нулевым
символом
Если переменная по логике работы программы никак не может принять какое-либо значение, то она его обязательно примет. (какой-то из
законов подлости)

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

Код: plaintext
1.
 memmove(str, str+n, <сам напиши а то мне лень>);
...
Рейтинг: 0 / 0
..хм... а КАК? ...можно обрезать строку?
    #33226116
q
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
q
Гость
memmove(str, str+n, strlen(str+n));
...
Рейтинг: 0 / 0
..хм... а КАК? ...можно обрезать строку?
    #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
..хм... а КАК? ...можно обрезать строку?
    #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
..хм... а КАК? ...можно обрезать строку?
    #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
..хм... а КАК? ...можно обрезать строку?
    #33228779
Фотография Анн
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
char str[Длина];
...
Обрезать строку до нужного символа

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


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

Можно так:

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


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