Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] sscanf nieznana ilość argumentów

Ostatnio zmodyfikowano 2010-10-30 18:57
Autor Wiadomość
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:
C/C++
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:
C/C++
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
P-23432
pekfos
» 2010-10-30 15:32:33
hehe.. to kasuj tę liczbę pierwszą liczbę.. np. funkcją substr
P-23433
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?
P-23435
michalp
» 2010-10-30 16:12:09
Zobacz co zwraca
sscanf
 i pomyśl jak możesz to wykorzystać.
P-23436
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)
P-23439
malan
» 2010-10-30 16:35:50
C/C++
#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; //Liczymy ilość ' ' (spacji). Tak naprawdę to sprawdzamy ile mamy liczb.
   
    for( int i = 0, j = 1; i < counter; i++, j += 4 )
    {
        sscanf( str.c_str(), res.c_str(), & array[ i ] ); //Odczytujemy liczbę.
        res.insert( j, 1, '*' ); //Pomiędzy '%', a 'd' wstawiamy znak '*', który informuje sscanf żeby ten argument pominęła.
        res += " %d"; //Informujemy sscanf, że chcemy następną liczbę.
    }
   
    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
P-23440
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ć:)
P-23441
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? ;)
P-23442
« 1 » 2 3
  Strona 1 z 3 Następna strona