2017-04-15 3 views
0

Ich mache ein Schulprojekt in C und ich bin bei diesem Puzzle fest. Also müssen wir ein Nachrichtenübergabesystem mit Sockets für 100 Benutzer implementieren.
Ich speichere die Daten meiner Benutzer in dieser Struktur.Funktion in einer Schleife stecken

typedef struct user 
{ 
    char username[20]; 
    int online;  //flag value 1 = online, 0 = offline 
    msg *message_list; 
    int message_count; 
} 

Und ein Service, den wir implementieren müssen, ist eine Liste aller aktuell verbundenen Benutzer zu ziehen. Ich habe diese Funktion für diese Aufgabe geschrieben.

void all_connected(char buf[2300]) 
{ 
    printf("\n entering all_connected for %d iterations",user_count); 
    int i, count = 1; 
    char tmp[25]; 
    for (i=0; i<user_count; i++) 
    { 
     if(users[i] -> online == 1) 
     {    
      sprintf(tmp, "\n\t%d. %s", count++, users[i] -> username); 
      strcat(buf, tmp); 
     } 
    } 
    printf("\n exiting all_connected"); 
} 

Jetzt aus irgendeinem seltsamen Grund, wenn ich diese Funktion aufrufen, wenn der Dienst angefordert wird, druckt es das erste printf (all_connected für x Iterationen eintritt); aber es druckt nicht den, den ich auf die letzte Zeile gesetzt habe. Bedeutet das, dass die Funktion in einer Zeile stecken bleibt? Ich habe überprüft und es wiederholt 'user_count' mal, aber nie in der letzten Zeile.

Was könnte ein Grund dafür sein?

+0

Fügen Sie einige 'printf()' ruft innerhalb der Schleife und der 'if' Anweisung auf. –

+0

Ich hatte einen Ausdruck in der if-Anweisung. Es beendet alle Iterationen. – zomboy

+0

Sie sollten das in Ihrem Code hier zeigen. –

Antwort

0

Diese Formatzeichenfolge "\n\t%d. %s" (unter Annahme von bis zu 20 Zeichen pro Benutzer) benötigt einen 26-Byte-Puffer (ASCII). Hier ist der Grund:

  1. 1 oder 2 Bytes für die "\n" (je nach System)
  2. bis zu 2 Bytes für "%d" (vorausgesetzt, Sie zählen bis zu 99)
  3. 2 Bytes für ". "
  4. up bis 20 Bytes für "%s"

Ihre temporären Puffer char tmp[25]; ist zu schmal, - mindestens 26 Bytes groß (Zählen des NULL-Terminator) sein.

Wenn Sie eine Liste von 100 Benutzern haben, die einen Gesamtpuffer von mindestens 2601 Bytes erfordern würden, sehen Sie nur die Funktion mit dem Puffer der Größe 2300. Randnotiz, nur die Funktionen angeben Eingabeparameter als char buf[2300] tut nichts zu tatsächlich zuweisen diesen Puffer. Sie müssen sicherstellen, dass Sie den erforderlichen Puffer bereitstellen, wenn Sie Ihre Funktion aufrufen.

Der Grund, warum Sie nicht die zweite printf() erhalten, ist, weil Ihr Programm beendet wird, bevor Sie diesen Punkt erreichen. Der Grund für die Beendigung ist Speicherzugriffsverletzung - das passiert, wenn Sie versuchen, etwas in den Speicher zu schreiben, der nicht zu Ihren Puffern gehört (entweder ein kleiner oder der Fehler)

+0

Das Problem sollte eher tmp Variable als Buf sein. Die buf-Variable sendet wirklich einen Zeiger ein, so dass strcat() darauf gespeichert bleibt. Es hätte einen Segmentierungsfehler geben sollen, wenn die tmp-Variable überläuft. –

Verwandte Themen