2010-12-14 8 views
1

Im ziemlich neu zu c Entschuldigung, wenn dies eine dumme Frage ist!c entfernen neue Zeile char Hilfe

ich habe dies:

fgets(question,200,stdin); 
    char *memq = malloc(sizeof(strlen(question))); 
    memq= question; 

jedoch die Frage Variable eine neue Zeile am Ende immer hat! Wie entferne ich das/verhindere es?

Ich habe dies versucht:

fgets(question,200,stdin); 
    char *memq = malloc(sizeof(strlen(question))-sizeof(char)); 
    memq= question; 

gab es keine Wirkung!

+0

Die Zuweisung 'memq = question' wird Speicher verlieren, weil Sie Ihren einzigen Zeiger auf den' malloc'-ed Speicher verlieren. Ich glaube, du wolltest 'strcpy()' benutzen. –

Antwort

5

auf der Newline loszuwerden, bevor Ihr malloc, tun: die

question[strcspn(question, "\n")] = '\0'; 

Änderung:

question[strlen(question)-1] = 0; 

eine Alternative wäre (in den Kommentaren unten vorgeschlagen) die folgenden stattdessen zu tun malloc Linie:

char *memq = malloc(strlen(question)+1); 

Änderung der assignation Linie:

memq = question; 

zu:

strcpy (memq, question); 
+0

danke, dass gearbeitet im mir nicht sicher, was das ist, können Sie erklären? – learner123

+0

Zeile 1 ersetzt die neue Zeile durch eine Null (0 oder '\ 0') - Zeile 2 reserviert Speicher für die gelesene Zeichenfolge plus 1 Byte für das Nullzeichen; Zeile 4 (ersetzt Zeile 3) kopiert Ihre gelesene Zeichenfolge in den zugewiesenen Puffer. Beachten Sie auch, dass Sie diesen zugewiesenen Puffer irgendwann in der Zukunft freigeben müssen (es ist Ihr Job als C-Programmierer) – KevinDTimm

+1

Ich würde 'question [strlen (question) -1] = 0;' mit 'question [strcspn (Frage, "\ n")] = '\ 0'; '. Wenn die Frage länger als 200 Zeichen ist, überschreibt das erste Zeichen, welches Zeichen am vorletzten Ort ist (es wird kein Zeilenende sein), während das letztere * nur * NUL den Zeilenumbruch ausführt. – SiegeX

1

Lassen Sie uns sagen, dass Ihre Eingabe ABCDEn, wo der n die neue Linie darstellt.

Sie werden in ABCDEn0 lesen, wobei 0 für null steht, was die Zeichenfolge beendet.

Also, indem Sie den letzten Char entfernen, nehmen Sie die Null, nicht die Newline. Ich würde das letzte Zeichen entfernen, wie du bist, aber dann setze das (neue) letzte Zeichen auf null, um deine Zeichenfolge zu beenden.

2

Dieser Code ist stark beschädigt.

Sie müssen strlen+1 Bytes in memq zuzuweisen, wenn Sie die Daten dort kopieren wollen (warum Sie sizeof tun?, Die 4 Bytes zuteilen wird seit sizeof(strlen()) ist sizeof(int)).

können Sie nicht nur question zu memq zuweisen und erwarten in werden die Daten kopiert. All dies ist den Zeiger einfach malloc -ed in memq, undichte es nicht überschreibt. Sie haben

strcpy(memq, question); 

zu tun, das ist, warum Sie das zusätzliche Byte in memq müssen, da dies ein Nullabschluss enthält. An diesem Punkt sind Sie in der Lage, den Zeilenumbruch von memq zu entfernen, wie an anderer Stelle erwähnt.

1

In beiden Fällen ist memq = questionfalsch.Sie haben gerade Ihre Zeiger auf neuen neu zugewiesenen Platz verloren und stattdessen kopierten die Adresse des ersten Zeichens von question zu memq

Verwenden strcpy oder memcpy stattdessen wies den Inhalt der Zeichenfolge kopieren von question auf den Inhalt des Speichers, auf den memq zeigt.

0

Hinweis: Entfernen Sie das letzte Zeichen! (Hinweis: Sie kennen die Länge)

Verwandte Themen