LINUX.ORG.RU

[C] выборка из строки всего одной цифры

 


0

1

Подскажите хитрость, как избавиться от ненужного мне сожержимого, при этом выделив как можно меньше памяти,

может схитрить как либо с указателями?


int main()

{

	int a;

	char in[] = "текстексттекстекст 1000 текстексттекстексттекстекст";

	sscanf(in, "%s %d %s", ???, &a, ???); //? что бы подставить? линуксовая привычка всё кроме циферки на /dev/null

	return 0;

}

длину текста заранее не знаю( динамически память расходовать тоже не охота.



Последнее исправление: sadavod (всего исправлений: 1)
Ответ на: комментарий от sadavod

я там ничего не видю)

Это потому, что ты его не пытался читать.

An optional '*' assignment-suppression character: scanf() reads input as directed by the conversion specification, but discards the input. No corresponding pointer argument is required, and this specification is not included in the count of successful assignments returned by scanf().

geekless ★★
()

[code=c] sscanf(in, «%*s %d %*s», &a); [/code] вроде бы, на коленке

nanoolinux ★★★★
()

int main()

{

	int a;

	char in[] = "текстексттекстекст 1000 текстексттекстексттекстекст";
 	char * z, * q;

	z = strpbrk(in, "1234567890");
	for(q = z; *q && isdigit(q); q++);
	q = '\0';
	a = atoi(z);

	return 0;

}

Или так:


int main()

{

	int a;

	char in[] = "текстексттекстекст 1000 текстексттекстексттекстекст";
	char * shit = strdup(in);

	sscanf(in, "%[^0-9]%d%[^0-9]", shit, &a, shit);
	free(shit);
	return 0;

}

Makefile
()
Ответ на: комментарий от geekless

я на своём родном читал)) не придал этому значение. geekless спасибо.

sadavod
() автор топика
Ответ на: комментарий от note173

тебе тоже ман чудотворный

А %s разве правильно прочитается в таком тексте?

s Matches a sequence of non-white-space characters; the next pointer must be a pointer to character array that is long enough to hold the input sequence and the terminating null byte ('\0'), which is added automatically. The input string stops at white space or at the maximum field width, whichever occurs first.

geekless ★★
()
Ответ на: тебе тоже ман чудотворный от geekless

или тоже самое на моём) s Ожидается ввод строки литер. Аргумент дол- жен быть указателем на строку. Поле вво- да заполняется до тех пор, пока не считает- ся пробел или литера новой строки, которые не являются частью поля ввода. К концу строки добавляется 0.

sadavod
() автор топика
Ответ на: тебе тоже ман чудотворный от geekless

Да ну, ошибешься где-нибудь и потом целый день искать ошибку. Здесь лучше вручную пройтись до нужного места, а потом распарсить число.

note173 ★★★★★
()
Ответ на: комментарий от geekless

просто интересно, а во что разворачивается scanf? Или это нечто на ассемблере?

Может поколдотвать руками, вручную определив границы подстроки, скопировав строку саму в себя и обрезав конец? Конечно, уйдет еще несколько интовых переменных, но их можно сделать глобальными и юзать для всех таких задач...

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

> их можно сделать глобальными
И когда неожиданно понадобится многопоточность долго и с удовольствием отлавливать баг?

trex6 ★★★★★
()
Ответ на: комментарий от stevejobs

а во что разворачивается scanf? Или это нечто на ассемблере?

А?

geekless ★★
()
Ответ на: комментарий от trex6

он ничего не говорил про многопоточность. Он говорил про расходование памяти. Если память супер дорогая (какой-нибудь код для кофеварки или зажигалки), можно хоть shared memory устроить -)

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

stevejobs

он ничего не говорил про многопоточность. Он говорил про расходование памяти. Если память супер дорогая

может просто строчки супер длинные. sqldump какой-нить.

по теме man 3 strpbrk

drBatty ★★
()
a=strtol(in+strcspn(in,"0123456789"),NULL,10);
if ((a==LONG_MAX || a==LONG_MIN) && errno==ERANGE) {
  /* нету цифирь или их слишком много */
  return 1;
}
printf("a=%d\n",a);
MKuznetsov ★★★★★
()

выборка из строки всего одной цифры

«текстексттекстекст 1000 текстексттекстексттекстекст»;

1000 это не одна цифра, дубинушка

anonymous
()

мне чота кажется, что так будет быстрее

#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
	char *s = "текстексттекстекст 1000 текстексттекстексттекстекст";
	
	while (*s && isdigit(*s) == 0) ++s;
	int a = atoi(s);
	printf("%i\n", a);
	
	return 0;
}
ну или нет

anonymous
()
int a;
char in[] = "текстексттекстекст 1000 текстексттекстексттекстекст";

sscanf(in, "%*[^0-9]%d", &a);
printf("%d\n", a);

подавить все, пока не встретили цифру, прочитать число. и ничего выделять не нужно дополнительно

vvviperrr ★★★★★
()
Ответ на: комментарий от vvviperrr

вот только регэкспы — это не быстро, и не

при этом выделив как можно меньше памяти

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.