2013-05-01 3 views
9

normal, Strlen() zählt nicht den Nullabschluss am Ende der Zeichenfolge. Unter dem Code wird jedoch die Zeichenfolge count mit dem Nullabschlusszeichen ausgegeben. Kann mir jemand erklären warum? Dankstrlen() gibt die Zeichenfolge count mit dem Nullterminator zurück

char str2[100]; 
printf("\nEnter a string: "); 
fgets (str2, sizeof(str2), stdin); 
printf("\n%d",strlen(str2)); 
+11

Es zählt wohl das '\ n ', anstatt das' \ 0' –

+0

Also, welche Zeichenfolge haben Sie eingeben, und was war das Ergebnis? –

+0

mögliches Duplikat von [fgets() fügt am Ende Zeilenumbrüche hinzu] (http://stackoverflow.com/questions/13443793/fgets-adds-newline-at-the-end) –

Antwort

34

Ich gehe davon aus der vorhergehenden fgets Prompt nahm den newline Charakter.

Zum Beispiel:

Sie in apple setzen.

Intern wurde Ihre Zeichenfolge als apple\n\0 gespeichert.

strlen kehrte dann 6 für apple + '\n'

+1

Schöne Erklärung. Willkommen bei SO! –

+1

Danke @luserdroog :) –

+0

@hmdb können Sie dies als Antwort akzeptieren? – Gewure

0

fgets() liest bis \n angetroffen wird. Wenn der Benutzer anshul eingibt, enthält str2anshul\n\0.

strlen() wird 7 zurückgeben, weil strlen() sucht, bis es das NULL ('\ 0') Zeichen findet.

2

Hier haben Sie die Funktion fgets() verwendet, um Eingaben zu machen. Wenn Sie die Eingabe mit der Funktion fgets() durchführen, wird ein zusätzliches neues Zeilenzeichen ('\ n') hinzugefügt. Angenommen, Ihre Eingabe lautet: "Hallo". Nachdem Sie diesen Stich eingegeben haben, müssen Sie die EINGABETASTE drücken, für die ein neues Zeilenzeichen mit Ihrer Zeichenfolge hinzugefügt wird. Daher scheint es Ihnen, dass strlen() den Null-Terminator zählt. Wenn Sie jedoch die Eingabe mit der Funktion scanf() vornehmen, wird kein zusätzliches Zeilenzeichen ('\ n') hinzugefügt, wenn ENTER gedrückt wird. So sehen Sie die genaue Anzahl der Zeichen, die die Zeichenfolge enthält. Führen Sie den folgenden Code aus, um meine Erklärung zu sehen.

#include<stdio.h> 
#include<string.h> 

void main() 
{ 
char str2[100]; 
printf("\nEnter a string: "); 
scanf("%s",str2); 
//fgets (str2, sizeof(str2), stdin); 
printf("\n%d",strlen(str2)); 
} 
3

Die fgets() Funktion akzeptiert die Eingabe, wenn ein Newline-Zeichen (Enter-Taste, wenn stdin verwendet) angetroffen wird, und das Newline-Zeichen \n ist ein gültiges Zeichen von der Funktion und in der Zeichenkette kopiert berücksichtigt Ihre str2. Wenn Sie es als Parameter an strlen() übergeben, gibt es daher mehr als die ursprüngliche Anzahl von Zeichen in Ihrer Zeichenfolge, um das zusätzliche Zeichen \n zu berücksichtigen.

Wenn Sie die ursprüngliche Anzahl von Zeichen haben möchten oder kein \n hinzugefügt werden soll, verwenden Sie die gets()-Funktion, da das Zeilenumbruchzeichen nicht kopiert wird.Weiterhin müssen Sie nur die Zeichenfolge als Argument übergeben. es ist nicht erforderlich, den Stream (stdin) als Standardstream für gets() an stdin zu übergeben.

char str2[100]; 
printf("\nEnter a string: "); 
gets(str2); 
printf("\n%d",strlen(str2)); 
0

bekommt (s) schließt nicht die ‚\ n‘, wenn Sie die Enter-Taste getroffen, nachdem die string.But Eingabe getan, fgets() enthält die ‚\ n‘, während aus einer Datei zu lesen.

Gemäß der Manpage (Verwendung: Mann fgets) auf Linux-Terminal,

fgets() liest höchstens eine weniger als Größe Zeichen aus dem Stream und speichert sie in den Puffer auf den s in. Das Lesen stoppt nach einem EOF oder Newline.Wenn eine neue Zeile gelesen wird, wird sie im Puffer gespeichert. Ein abschließendes Null-Byte ('\ 0') wird nach dem letzten Zeichen im Puffer gespeichert.

0

Wie von anderen angegeben, liest fgets() das Newline-Zeichen (\ n) und speichert es in Ihrem Array.

nach jedem Aufruf von fgets() verwende ich immer strcspn(), um das Array/den Zeiger nach dem Zeilenumbruchzeichen zu suchen und es durch das Nullzeichen zu ersetzen.

char str2[100]; 
printf("\nEnter a string: "); 
fgets (str2, sizeof(str2), stdin); 

//new line of code to replace '\n' with '\0' 
str2[strcspn(str2, "\n")] = '\0'; 

printf("\n%d",strlen(str2)); 
Verwandte Themen