Ich benutze Ubuntu und ich benutze auch Geany und CodeBlock als meine IDE. Was ich versuche, ist das Lesen einer Zeichenfolge (wie "Barack Obama"
) und lege es in eine Variable:
#include <stdio.h>
int main(void)
{
char name[100];
printf("Enter your name: ");
scanf("%s", name);
printf("Your Name is: %s", name);
return 0;
}
Ausgabe:
Enter your name: Barack Obama
Your Name is: Barack
Wie kann ich das Programm den ganzen Namen lesen lassen?
Verwenden:
fgets (name, 100, stdin);
100
Ist die maximale Länge des Puffers. Sie sollten es an Ihre Bedürfnisse anpassen.
Verwenden:
scanf ("%[^\n]%*c", name);
Das []
Ist das gescannte Zeichen. [^\n]
Teilt mit, dass während der Eingabe keine neue Zeile ('\n'
) Eingegeben wird. Dann liest es mit dem %*c
Das Zeilenumbruchzeichen aus dem Eingabepuffer (der nicht gelesen wird), und das *
Zeigt an, dass diese eingelesene Eingabe verworfen wird (Zuweisungsunterdrückung), wie Sie dies nicht tun brauche es, und diese neue Zeile im Puffer schafft kein Problem für die nächsten Eingaben, die Sie möglicherweise nehmen.
Lesen Sie hier die Operatoren Scanset und Zuweisungsunterdrückung .
Beachten Sie, dass Sie auch gets
verwenden können, aber ....
Verwenden Sie niemals
gets()
. Da es unmöglich ist, zu sagen, wie viele Zeichen () gelesen werden, ohne die Daten im Voraus zu kennen, undgets()
weiterhin Zeichen nach dem Ende des Puffers speichert, ist die Verwendung äußerst gefährlich. Es wurde verwendet, um die Computersicherheit zu brechen. Verwenden Sie stattdessenfgets()
.
Versuche dies:
scanf("%[^\n]s",name);
\n
legt nur das Trennzeichen für die gescannte Zeichenfolge fest.
Im Folgenden finden Sie ein Beispiel dafür, wie Sie mithilfe der Funktion fgets
Eingaben mit Leerzeichen abrufen können.
#include <stdio.h>
int main()
{
char name[100];
printf("Enter your name: ");
fgets(name, 100, stdin);
printf("Your Name is: %s", name);
return 0;
}
scanf(" %[^\t\n]s",&str);
str
ist die Variable, von der Sie den String erhalten.
HINWEIS: Wenn Sie fgets () verwenden, ist das letzte Zeichen im Array '\ n', wenn Sie fgets () für kleine Eingaben in CLI (Befehlszeileninterpreter) verwenden und die Zeichenfolge mit 'Enter' beenden. Wenn Sie die Zeichenfolge drucken, springt der Compiler beim Drucken der Zeichenfolge immer zur nächsten Zeile. Wenn Sie möchten, dass die Eingabezeichenfolge ein nullterminiertes Zeichenfolgenverhalten aufweist, verwenden Sie diesen einfachen Hack.
#include<stdio.h>
int main()
{
int i,size;
char a[100];
fgets(a,100,stdin);;
size = strlen(a);
a[size-1]='\0';
return 0;
}
Update: Aktualisiert mit Hilfe anderer Benutzer.
#include <stdio.h>
// read a line into str, return length
int read_line(char str[]) {
int c, i=0;
c = getchar();
while (c != '\n' && c != EOF) {
str[i] = c;
c = getchar();
i++;
}
str[i] = '\0';
return i;
}
#include<stdio.h>
int main()
{
char name[100];
printf("Enter your name: ");
scanf("%[^\n]s",name);
printf("Your Name is: %s",name);
return 0;
}
Wenn Sie mehr als eine Zeile lesen müssen, müssen Sie den Puffer löschen. Beispiel:
int n;
scanf("%d", &n);
char str[1001];
char temp;
scanf("%c",&temp); // temp statement to clear buffer
scanf("%[^\n]",str);
Mit diesem Code können Sie Eingaben vornehmen, bis Sie die Eingabetaste Ihrer Tastatur drücken.
char ch[100];
int i;
for (i = 0; ch[i] != '\n'; i++)
{
scanf("%c ", &ch[i]);
}
Die richtige Antwort lautet:
#include <stdio.h>
int main(void)
{
char name[100];
printf("Enter your name: ");
// pay attention to the space in front of the %
//that do all the trick
scanf(" %[^\n]s", name);
printf("Your Name is: %s", name);
return 0;
}
Dieses Leerzeichen vor% ist sehr wichtig, denn wenn Sie in Ihrem Programm noch ein paar Scanf haben, nehmen wir an, Sie haben 1 Scanf mit einem ganzzahligen Wert und einen weiteren Scanf mit einem doppelten Wert ... wenn Sie den Scanf für Ihr Zeichen (String) erreichen name) Dieser Befehl wird übersprungen und Sie können keinen Wert dafür eingeben. Wenn Sie jedoch dieses Leerzeichen vor% setzen, ist alles in Ordnung und nichts wird übersprungen.
"Barack Obama" hat ein Leerzeichen zwischen "Barack" und "Obama". Verwenden Sie dazu diesen Code.
#include <stdio.h>
int main()
{
printf("Enter your name\n");
char a[80];
gets(a);
printf("Your name is %s\n", a);
return 0;
}
Die oben genannten Methoden funktionieren zwar, aber jede hat ihre eigenen Probleme.
Sie können getline()
oder getdelim()
verwenden, wenn Sie eine von posix unterstützte Plattform verwenden. Wenn Sie Windows und Minigw als Compiler verwenden, sollte es verfügbar sein.
getline()
ist definiert als:
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
Um Eingaben vornehmen zu können, müssen Sie zunächst einen Zeiger auf den Typ char erstellen.
#include <stdio.h>
#include<stdlib.h>
// s is a pointer to char type.
char *s;
// size is of size_t type, this number varies based on your guess of
// how long the input is, even if the number is small, it isn't going
// to be a problem
size_t size = 10;
int main(){
// allocate s with the necessary memory needed, +1 is added
// as its input also contains, /n character at the end.
s = (char *)malloc(size+1);
getline(&s,&size,stdin);
printf("%s",s);
return 0;
}
Beispiel Eingabe: Hello world to the world!
Ausgabe: Hello world to the world!\n
Hier ist zu beachten, dass getline s
mit realloc()
neu zuweist, obwohl der zugewiesene Speicher für s 11 Byte beträgt, wobei die Eingabegröße 26 Byte beträgt.
Es spielt also keine Rolle, wie lange Ihre Eingabe dauert.
size
wird mit der Anzahl der gelesenen Bytes gemäß der obigen Beispieleingabe aktualisiert. size
wird 27
sein.
getline()
berücksichtigt auch \n
als Eingabe. Ihr 's' wird am Ende '\ n' enthalten.
Es gibt auch eine allgemeinere Version von getline()
, nämlich getdelim()
, für die ein weiteres Argument erforderlich ist, nämlich delimiter
.
getdelim()
ist definiert als:
ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);