N zeichen einlesen, den rest verwerfen: wie?



  • moin,

    ich bringe mir grad Socketprogrammierung unter C bei und schreibe grad zum erlernen ein chat programm.das hat bis hier hin auch ganz gut geklappt, nur das problem ist folgendes:

    in einem chat muss der anwender text eingeben. ich habe ein textlimit festgemacht, gibt der anwender weniger ein ist alles ok, gibt er mehr ein geht nix.

    also folgendes: ich will das das programm N zeichen von stdin einliest, und den rest verwirft. meine einlese schleife sah bisher so aus:

    while(fgets(buff_send,TEXTLIMIT,stdin) != NULL )
    {
    if ( buff_send[0] == '\n')
    exit(0);

    strcpy(mick,nick);
    strcat(mick,buff_send);

    send(sockfd, mick, strlen(mick)-1,0);
    }

    das klappt soweit auch, nur wenn der anwender mehr zeichen als TEXTLIMIT eingibt, bliebt der rest in stdin hängen und wird beim nächsten durchlauf eingelsen; das wäre auch ok wenn alles dann gescheit weitergehen würde,sprichgibt der anwender mehr ein kommt die messge halt in 2 teilen an. aber da dem so nicht ist möchte ich das die anzahl TEXTLIMIT in den buffer gelesen wird wie es fgets macht, der rest soll verworfen werden!

    was natürlich geht ist ne müll funktion,die den überschuss einliest und in einen nicht gebrauchten buffer schreibt.

    void empty(void)
    {
    char buff[2000];
    gets(buff);
    }

    also gibt der anwender zuviel zeichen wird der rest "weggelesen". das geht auch wennder anwender zuviel eingibt, tut er es abernicht geht es net mehr da es keinen müll gibt den es wegzulesen gilt. also muss man testen ob was in stdin ist,wenn ja wird emptyaufgerufen;ein
    if(stdin)empty(); geht aber net.dann bekam ich folgenden vorschlag:

    while(0 < (P=read(0, buff_send, TEXTLIMIT-1)))

    {
    if ( buff_send[0] == '\n')
    exit(0);
    buff_send[P]='\0';

    strcpy(mick,nick);
    strcat(mick,buff_send);

    send(sockfd, mick, strlen(mick)-1,0);
    }

    die lösung geht wenn der anwender EIN WENIG ZUVIEL eingibt:dann wird die message in 2 teilen ausgeben. gibt deraber viel zu viel eingeht ds auch net. also dachte ich mir mache ich noch folgendes rein:

    if(P>=TEXTLIMIT) empty();

    wenn also die anzahl eingelesener zeichen dem maximum übersteigt wird empty aufgerufen: das geht auchnet

    versteht jemand mein prob und kann mir helfen? danke 🙂



  • Leere den Buffer einfach mit

    fflush(stdin);
    

    Manchmal ist die Lösung einfacher als du glaubst. 😉



  • ChockoCookie schrieb:

    Leere den Buffer einfach mit

    fflush(stdin);
    

    Manchmal ist die Lösung einfacher als du glaubst. 😉

    das habe ich auch probiert,ging leider nicht 😞

    evtl hat es sich erledigt, da folgende lösung wohl funktioniert:

    while(0 < (P=read(0, buff_send, TEXTLIMIT-1)))
    
    		{
    			if ( buff_send[0] == '\n')
        				exit(0);
    			buff_send[P]='\0';
    
    			if(P==TEXTLIMIT-1)
    				empty();
    
    			strcpy(mick,nick);
    			strcat(mick,buff_send);
    
    			send(sockfd, mick, strlen(mick)-1,0);
    		}
    


  • smurf schrieb:

    das habe ich auch probiert,ging leider nicht 😞

    Seltsam, in der MSDN steht wörtlich:

    MSDN schrieb:

    ... If the stream is open for input, fflush clears the contents of the buffer. ...

    😕
    Aber wenn du es so hinbekommen hast...

    Allerdings: was passiert, wenn der benutzer exakt TEXTLIMIT-1 bytes eingiebt?



  • ChockoCookie schrieb:

    smurf schrieb:

    das habe ich auch probiert,ging leider nicht 😞

    Seltsam, in der MSDN steht wörtlich:

    MSDN schrieb:

    ... If the stream is open for input, fflush clears the contents of the buffer. ...

    😕
    Aber wenn du es so hinbekommen hast...

    Allerdings: was passiert, wenn der benutzer exakt TEXTLIMIT-1 bytes eingiebt?

    mich hat das auch sehr gewundert wieso das mit fflush nicht ging

    Allerdings: was passiert, wenn der benutzer exakt TEXTLIMIT-1 bytes eingiebt?
    wenn das jemand schaffen sollte, die zahl zufällig zu treffen, muss er halt 2mal enter drücken ;)aber im moment bin ich froh überhaupt ne lösung zu haben


Log in to reply