Einlesen von Strings!!!!!!!!



  • Hello!

    Und zwar hab ich folgende Frage:
    Wenn ich folgenden String einelese "Max Mueller" und ihn
    wieder per printf ausgebe. Warum gibt er mir nur Max aus????

    #include <stdio.h>
    #include <stdlib.h>
    
    void main (void)
    {
    char cString[50];
    
    printf("Geben Sie bitte einen String ein: \n");
    scanf("%s",cString);
    
    printf(cString);
    
    }
    

    Danke!!!
    lg
    Mini



  • Weil scanf() bei einem White-Space ('\t', '\n', ' ', etc.) abbricht.

    Verwende stattdessen fgets().

    P.S.: Zumindest ich habe es so gelernt, dass man vor Strings "sz" schreibt und bei einzelnen Zeichen "c".



  • Danke!!!! dh. mit scanf ist es nicht möglich!

    Dann hätte ich noch eine Frage. Dieses Programm speichert die
    Daten einer Struktur ab. Und zwar die Untervariable Name wird
    richtig abgespeichert aber bei der Untervariable Alter wird
    irgendwas gespeichert bzw. irgendwelche Zeichen!!! Was ist da falsch?

    #include<stdio.h>
    #include<stdlib.h>
    
    struct Person
    {
    
    char Namen[30];
    int Alter;
    
    }Telefon;
    
    void main(void)
    {
    char Pruef;
    char Dateinamen[30];
    FILE *p_file;
    
    printf("Geben Sie bitte den Dateinamen ein: \n");
    scanf("%s",Dateinamen);
    
    p_file = fopen(Dateinamen,"w");
    
    if(!p_file)
    {
    printf("Kein Laden der Datei möglich!\n");
    return;
    }
    
    do
    {
    printf("\n Namen: ");
    scanf("%s", Telefon.Namen );
    
    printf("\n Alter: ");
    scanf("%d", &Telefon.Alter );
    
    fwrite(&Telefon ,sizeof(Telefon),1,p_file);
    
    printf("Wollen Sie noch Dateien Speichern? [j]/[n]\n");
    scanf("%s",&Pruef);
    
    }while((Pruef=='j') || (Pruef=='J'));
    
    fclose(p_file);
    
    }
    

    Danke!!!!!!!!!



  • Anzi-C schrieb:

    P.S.: Zumindest ich habe es so gelernt, dass man vor Strings "sz" schreibt und bei einzelnen Zeichen "c".

    schon wieder einer, der diese polnische notation verwendet 😉



  • fopen "w" heißt "wt", neue Datei im Textmodus erstellen. Ich würde "wb" nehmen -> Binärmodus
    Vielleicht liegt es auch am sizeof(Telefon) -> sizeof(struct Telefon)



  • schon wieder einer, der diese polnische notation verwendet 😉

    Ich verwende sie nicht, da ich einfach zu faul bin. Allerdings haben wir sie gelernt und unser Prof verwendet sie mit Leidenschaft... 😉

    sizeof(struct Telefon)

    sizeof(struct Person) müsste es heißen



  • @net: ja, würg *fg*. BTW warst es nicht du, der mich (damals noch als unreg) davon abgebracht hat 😉

    Greetz, Swordfish



  • Anzi-C schrieb:

    "sz"

    Wer Ordnung hält, ist nur zu faul zum szuchen.



  • Hab beides ausprobiert! Wenn ich statt w wb eintippe ändert sich gar nichts und
    wenn ich sizeof(struct Telefon) eingebe kommt eine Fehlermeldung!Leider!!!



  • Und dann würde ja nicht der Namen richtig gespeichert werden, oder?



  • Swordfish schrieb:

    @net: ja, würg *fg*. BTW warst es nicht du, der mich (damals noch als unreg) davon abgebracht hat 😉

    ich glaub' nicht. ich lästere ja nur über sowas ohne begründungen zu liefern...



  • *gg* Naja während ihr über die ungarische Notation (die polnische ist etwas anderes 😉 ) schimpft habe ich mal sein Programm korrigiert.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct Person
    {
    	char Namen[30];
    	int Alter;
    } Telefon;
    
    int main(void)
    {
    	char Pruef;
    	char Dateinamen[30] = "";
    	int c;
    
    	FILE *p_file = NULL;
    
    	printf("Geben Sie bitte den Dateinamen ein: \n ");
    	fgets(Dateinamen, 30, stdin); 
    	if(Dateinamen[strlen(Dateinamen)-1] == '\n') // fgets() hinterlässt ein LF ('\n') das gelöscht werden muss
    		Dateinamen[strlen(Dateinamen)-1] = '\0';
    
    	p_file = fopen(Dateinamen, "wb");
    
    	if(p_file == NULL)
    	{
    		printf("Kein Laden der Datei möglich!\n");
    		exit(1);
    	}
    
    	do
    	{
    		printf("\n Namen: ");
    		fgets(Telefon.Namen, 30, stdin);
    
    		printf("\n Alter: ");
    		scanf("%d", &Telefon.Alter);
    		while((c=getchar()) != EOF && c != '\n');
    		// Komm ja nicht auf die Idee ffluh(stdin); zu verwenden ;-) 
    
    		fwrite(&Telefon, sizeof(struct Person), 1, p_file);
    
    		printf("Wollen Sie noch Dateien Speichern? [j]/[n]\n");
    		scanf("%c",&Pruef);
    		while((c=getchar()) != EOF && c != '\n');
    	}
    	while((Pruef=='j') || (Pruef=='J'));
    
    	fclose(p_file);
    
    	return 0;
    }
    

    So sollte es funktionieren.



  • Hab es gleich "reinkopiert" aber leider wir die Zahl wieder falsch
    abgespeichert!

    Aber trotzdem vielen Dank!!!!



  • Was verstehst du unter falsch abgespeichert? Ich habes eigentlich extra getestet und es sollte funktionieren. Ich vermute, du öffnest die Datei im Text-Editor?



  • Ja genau ich öffne sie im Text-Editor!
    Was ist daran falsch?



  • die daten werden binär gespeichert.
    mitm normalen editor ist angucken also nicht. musst die datei auch wieder im
    binär mode öffnen/angucken dann ist auch das ergebnis richtg...



  • Du schreibst die Datei binär, dir jetzt genau zu erklären wie z.B. floats oder ints gespeichert werden, sprengt den Rahmen. Google mal danach oder schau dir den Wikipedia-Artikel an: http://de.wikipedia.org/wiki/Binärdatei

    Wenn du deine Daten nachher noch mit dem Text-Editor lesen willst, musst du sie folgendermaßen schreiben:

    p_file = fopen(Dateinamen, "w");
    if(Telefon.Namen[strlen(Telefon.Namen)-1] == '\n') // fgets() hinterlässt ein LF ('\n') das gelöscht werden muss
        Telefon.Namen[strlen(Telefon.Namen)-1] = '\0';
    
    [..]
    
    // statt fwrite():
    fprintf(p_file, "%s %d\n", Telefon.Namen, Telefon.Alter);
    


  • Ok, vielen Dank nochmals!!!!!!!!!

    Danke!

    lg
    Mini



  • @net: stimmt, war groovemaster. Aber du hast auch deinen Senf dazugegeben. 😉

    Greetz, Swordfish


Anmelden zum Antworten