[C++] sscanf nieznana ilość argumentów
Ostatnio zmodyfikowano 2010-10-30 18:57
ison Temat założony przez niniejszego użytkownika |
[C++] sscanf nieznana ilość argumentów » 2010-10-30 15:08:07 Witam, mam taki oto kod: int tab[ 100 ]; std::string x = "5 67 54 23 56";
chciałbym przypisać do zmiennej tab wszystkie liczby ze string'a w jak najkrótszym czasie coś w stylu: while( sscanf( x.c_str(), "%d", & tab[ ++i ] ) );
tyle że sscanf zawsze zaczyna od początku string'a więc na każdym polu tablicy będzie znajdowała się ta sama liczba za pomoc będę wdzięczny |
|
pekfos |
» 2010-10-30 15:32:33 hehe.. to kasuj tę liczbę pierwszą liczbę.. np. funkcją substr |
|
ison Temat założony przez niniejszego użytkownika |
» 2010-10-30 15:34:58 @up myślałem o tym ale zdaje mi się że są na to szybsze sposoby, zależy mi na wydajności
//ewentualnie co jest lepsze (szybsze) przy korzystaniu z winsocketów: wysyłać n razy każdą liczbę z osobna czy wysyłać za każdym razem jeden duży pakiet ze wszystkimi i je potem rozdzielać przez substr? |
|
michalp |
» 2010-10-30 16:12:09 Zobacz co zwraca sscanf i pomyśl jak możesz to wykorzystać. |
|
ison Temat założony przez niniejszego użytkownika |
» 2010-10-30 16:28:20 wiem co zwraca sscanf (zresztą tak jak i scanf) ale nie wiem jak to ma mi niby pomóc ;) (przecież nawet wykorzystałem to w kodzie w moim pierwszym poście; lecz niestety ten sposób jest zły, gdyż sscanf zaczyna za każdym razem od początku string'a) |
|
malan |
» 2010-10-30 16:35:50 #include <algorithm> #include <cstdio> #include <iostream> #include <string>
const int arraySize = 100;
int main() { int * array = new int[ arraySize ]; int counter = 0; std::string str = "5 67 54 23 56"; std::string res = "%d"; counter = count( str.begin(), str.end(), ' ' ) + 1; for( int i = 0, j = 1; i < counter; i++, j += 4 ) { sscanf( str.c_str(), res.c_str(), & array[ i ] ); res.insert( j, 1, '*' ); res += " %d"; } for( int i = 0; i < counter; i++ ) std::cout << i << " " << array[ i ] << std::endl; delete[] array; return 0; } Przykład: %d //Odczytaj pierwszą liczbę -> 5 %*d %d //Zignoruj pierwszą liczbą, ale wczytaj następną -> 67 %*d %*d %d //Zignoruj pierwsze dwie liczby, ale wczytaj trzecią -> 54 %*d %*d %*d %d //...itd. %*d %*d %*d %*d %d
|
|
pekfos |
» 2010-10-30 16:39:11 chyba winsocketem szybciej będzie ci wysłać dane binarne. liczba 32bity. nie będziesz się musiał tak bawić:) |
|
ison Temat założony przez niniejszego użytkownika |
» 2010-10-30 16:41:13 dzięki malan :) algorithm jest raczej zbędny
michalp mógłbyś bardziej rozwinąć ten temat? ;) |
|
« 1 » 2 3 |