2016-07-30 10 views
0

Ich arbeite ein Projekt zu schaffen, das eine benutzerdefinierte Header-Datei hat, und lief in einige Probleme:Probleme mit printf() und fgets()

Ich bin mir nicht ganz sicher, was diesen Code passiert ist, aber nach Ich fing an, die fgets() Funktion zu benutzen, es scheint, die Ausgabe von etwas printf() in meinem Code zu stoppen. Hier sind die wichtigen Teile des Codes, wahrscheinlich fehlen einige #include Aussagen hier:

main.cpp

#include "ichat.h" 

int main() { 

    prompts(P_IDLE, response); 
    prompts(P_USERNAME, response); 
} 

ichat.cpp

#include "ichat.h" 
int prompts(int p_tag, char *response) { 

    if (p_tag == P_IDLE) { 

     printf("\nWaiting for connections. Press [ENTER] to start a chat."); 
     char msg[50]; 
     char *ptr; 
     while (true) { 

      fgets(msg, strlen(msg), stdin); 
      ptr = (char*)memchr(msg, '\n', strlen(msg)); 
      if (ptr != NULL) { 

       break; 
      } 

    } else if (p_tag == P_USERNAME) { 

     printf("\nPlease enter a username you'd like to use: "); 
     .... 

    } ... 

einige ichat.h, sofern Sie neugierig waren ...

#define P_IDLE 0 
#define P_USERNAME 1 

kompiliert mit gcc main.cpp ichat.cpp.

Das Problem besteht darin, dass beim Hinzufügen der While-Schleife mit der fgets()-Funktion keine der printf()-Funktionen die Ausgabe in der Befehlszeile erzeugt. Ich bin nicht genau sicher, was hier passiert, weil diese Druckfunktionen funktionierten, und manchmal funktionieren sie, wenn ich die \n entferne, oder wenn ich eine weitere printf() Funktion direkt vor ihnen hinzufüge. Es ist ziemlich verwirrend ...

Gibt es einen besseren Weg, um Eingaben vom Benutzer zu erhalten? Ich bin offen für irgendwelche Hinweise, Kritiken und Ideen zu irgendeinem Teil meines Codes.

+0

Sie haben geschrieben "Implementierung der' fgets() '-Funktion". Das klingt, als ob du deine eigene Version von 'fgets()' schreibst, aber der Code sieht so aus, als würdest du ihn nur aufrufen. Bitte aktualisieren Sie Ihre Frage, um das zu klären. –

+0

Was erwartest du, dass Strlen zurückkehrt, wenn du es an Fgets übergibst? Warum markieren Sie dieses C++, wenn Sie printf und fgets anstelle von iostreams verwenden? – kfsone

+0

'strlen()' übergibt die Länge der Zeichenfolge 'msg' an diese Funktion, denke ich. Ich benutzte 'printf' und' fgets', weil es mit einem Buch übereinstimmte, das ich zu diesem Thema gelesen hatte. Ich könnte es in Iostreams umwandeln, glaubst du, es würde helfen? – SuperContraptionGuy

Antwort

1

Der Kern des Problems ist

char msg[50]; 
/* no initialisation of data in msg */ 
fgets(msg, strlen(msg), stdin); 

msg ist uninitialised, so dass die Werte von einem der Zeichen in es unbestimmt sind - sie sind nicht Null zu sein, garantiert. Formal ergibt sogar der Zugriff auf ihre Werte (die strlen() tut, um nach einem '\0' zu suchen) undefiniertes Verhalten.

Was Sie tun müssen, ist strlen(msg) zu sizeof msg (die konsequent den Wert von 50 geben wird) zu ändern.

fgets() wird basierend auf Eingabe msg ändern. Dann können Sie strlen() auf das Ergebnis verwenden.

Auch: Versuchen Sie nicht, (char *) Typumwandlungen auf das Ergebnis von Funktionen wie memchr(), die void * zurückgeben. Es wird nur in C benötigt, wenn Sie #include <string.h> vergessen haben. Das Einbeziehen des richtigen Headers ist die bessere Lösung als die Typkonvertierung. Wenn Ihr C-Compiler tatsächlich ein C++ - Compiler ist, wird die Konvertierung benötigt, aber C++ bietet alternative Ansätze, die oft vorzuziehen sind (typsicherer usw.).

+0

können Sie einige dieser C++ - Ansätze geben? Ich würde gerne wissen, wie ich diesen Code verbessern kann, wenn es möglich ist. Danke für deine Antwort. – SuperContraptionGuy

+0

Das hängt davon ab, was Sie offensichtlich erreichen wollen. Im Allgemeinen ist C++ 's' std :: string' ein String-Typ, und es ist ein Standard-Container, so kann durch Standardalgorithmen gesucht werden. Wenn Sie genauere Ratschläge benötigen, geben Sie genau an, was Sie tun möchten, und stellen Sie eine mit C++ gekennzeichnete Frage. Es gibt viele Leute, die nützliche Ratschläge geben können. Machen Sie zunächst ein wenig Arbeit (z. B. lesen Sie sich den C++ - String-Typ und die Standardalgorithmen durch) - die Leute werden eher geneigt sein zu helfen, wenn Sie zuerst eine Anstrengung demonstriert haben. – Peter