char array ende erkennen?



  • folgendes...ich schreibe einen GANZ einfachen chat...hier das problem...
    nachdem ich die eingabe bekommen habe:

    char buf[256];
    	memset(&buf,0,255);
    
    	scanf("%s",&buf);
    

    kann ich ja sehen wie lang die eingabe ist, indem ich nach der ersten 0 suche, jetzt darf man aber keine 0 schreiben oder? wie kann ich das problem umgehen?



  • Dieser Thread wurde von Moderator/in cd9000 aus dem Forum WinAPI in das Forum ANSI C verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Wieso erstellst du ein Array von 256 Zeichen, übergibst beim memset aber 255 als Größe? Das memset ist sowieso unnötig. Ein statisches Array setzt man anders auf 0, aber scanf fügt schon ein Null-Zeichen an und terminiert damit den String.

    Statische Arrays kann man beim Erstellen komplett auf 0 setzen (bei dir aber unnötig, also bitte nicht übernehmen):

    char array[256] = {0};
    

    Man darf durchaus eine 0 schreiben. Du musst unterscheiden zwischen '0' (die Ziffer 0) und '\0' (das Null-Zeichen). Letzteres dürfte man nicht schreiben.

    btw, dein Code hat eine Sicherheitslücke; was passiert, wenn der User mehr als 255 Zeichen eingibt?



  • ja, danke erstmal...um die sicherheit kümmer ich mich aber später erst...
    gut das ist jetzt nie ziemliche anfängerfrage...wie kann ich einen char array mit einer zeichenkette vergleichen?
    so gehts nicht

    int clientComm(SOCKET sock)
    {
    	char buf[256] = {0};
    	do
    	{
    	scanf("%s",buf);
    	printf("Eingabe:%s\n",&buf);
    	}
    	while(buf != "exit");
    	return 0;
    }
    


  • Schau dir mal die Funktion strcmp an.

    btw:
    Ein automatisches Array komplett mit 0 zu initialisieren reicht afaik schon

    char buf[256] = {};
    


  • danke,genau das habe ich gesucht



  • cd9000 schrieb:

    Statische Arrays kann man beim Erstellen komplett auf 0 setzen (bei dir aber unnötig, also bitte nicht übernehmen):

    char array[256] = {0};
    

    Statische Arrays werden automatisch mit 0 initialisiert. Man braucht nichts zuweisen. Bei lokalen Arrays ist es egal, ob man ={0} schreibt oder memset benutzt.



  • pixxartist schrieb:

    ja, danke erstmal...um die sicherheit kümmer ich mich aber später erst...
    gut das ist jetzt nie ziemliche anfängerfrage...wie kann ich einen char array mit einer zeichenkette vergleichen?

    strcmp(array1,array2) // wenn du das meinst...

    strlen(arrayname); //überprüft die anzahl der zeichen bis zur \0. funktion gibt genau das feld aus wo die \0 ist.

    btw: warum liest du ein array mit dem adress operator '&' ein?
    Der Arrayname, wie du ihn deklariert hast, zeigt auf den anfang des Arrays... da ist das '&' überflüssig.



  • [sorry, hab überlesen was im post vor mir stand, also bleibt dieser post leer]



  • also

    1. arrays muß man in C++ nicht ausnullen. in C++ macht das der compiler automatisch. in C jedoch ist der wert von variablen nach der deklaration undefiniert. kurz: in C muß mans ausnullen, in C++ nicht.

    2. um zu prüfen, ob buf gleich "exit" ist, schreibe while(strcmp(buf,"exit")==0). du must dann aber noch #include <string.h> (bzw in C++ #include<cstring>) am programmanfang includen.

    3. dein programm hat noch einen fehler! scanf() liest nämlich das new-line am zeilenende mit ein! frag nicht warum. es macht sinn ist aber komliziert. wenn du "exit" und dann return eingibst, dan liefert dir dein scanf() nicht "exit" sondern "exit\n"!!! ändere also deinen scanf()-aufruf in scanf("^[\n]",buf). "^[\n]" bedeutet "alles lesen, außer new-line", dh er liest die ganze zeile ohne new-line. frag nicht was "^[\n]" genau bedeutet. scanf() gilt nicht umsonst als kompliziert.

    am besten du benutzt zum einlesen einer eingabezeile nicht scanf() sondern gets() oder besser fgets(). zb gets(buf). diese befehle lesen das zeilenende nicht mit ein und sind auch für anfänger zu verstehen! 😃



  • das "dach" muss in die eckigen klammern, außerdem muss ein % for die eckige klammer

    http://www.openbsd.org/cgi-bin/man.cgi?query=scanf&apropos=0&sektion=0&manpath=OpenBSD+Current&arch=i386&format=html

    kann man irgendwo nachlesen, dass in c++ arrays initialisiert werden? wir sind allerdings in ansi c, also muss das hier nicht rein.



  • Konfusius schrieb:

    1. arrays muß man in C++ nicht ausnullen. in C++ macht das der compiler automatisch. in C jedoch ist der wert von variablen nach der deklaration undefiniert. kurz: in C muß mans ausnullen, in C++ nicht.

    AFAIK verhalten sich C und C++ in diesem Punkt gleich. Grob gesagt, Arrays mit automatischer Lebensdauer (zB lokal) werden nicht initialisiert, Arrays mit statischer Lebensdauer (zB global) werden mit 0 initialisiert.


Anmelden zum Antworten