Hilfe bei C-Programm String einlesen ... ich komm einfach nicht auf meinen Fehler..



  • Hallo,
    ich lerne C seit ca. 4 Monaten und denke, auch dass ich die Basics soweit verstanden hab, jedoch sitz ich jetzt an einem C-Programm und versteh einfach nicht was ich falsch mache.

    Erstmal zur Aufgabe des Programms: Das Programm soll einen String einlesen (mit gets), dann die ersten 10 Zeichen in einen anderen String speichern, die restlichen Zeichen in einen anderen String.
    Anschließend sollen die die Großbuchstaben und Zahlen gezählt werden (was aber schon funktioniert).
    Ich schaffe es aber einfach nicht die Strings auszugeben. Hier erstmal mein Quellcode:

    #include <stdio.h>            
    #include <conio.h>           // Bibliothek fuer getch, gets, 
    #include <stdlib.h>	// für Clearscreen --> system ("cls");
    
    int main (void){
    
    char str[11];
    char all[100];
    char rest[89];
    int i = 0, j = 0, l=0;
    int gb = 0, z = 0;
    char h;
    int c, k;
    
    do{
    	printf ("Bitte geben Sie eine Zeichenkette ein:");
    	gets_s (all);
    
    		while (all[i] != '\0'){
    
    			if (i < 10){
    				str[i] = all[i];
    				str[i+1] = '\0';	
    				}
    			else{
    			rest[l] = all[i];
    			rest[l+1] = '\0';
    			l++;
    			}
    			i++;
    		}
    
    		k = i;
    		printf ("\nGespeicherter String: %s", str);
    		printf ("\nAbgeschnittener String: %s", rest);
    		printf ("\nLaenge des Gesamtstrings: %d", k);
    
    			for (j = 0; j <= i ; j++) {
    					h = all[j];
    
    					if (int (h) > 64 && int (h) < 91){
    
    						gb++;
    					}
    					if (int(h) > 47 && int (h) < 58){
    
    						z++;
    					}
    			}
    
    		printf ("\nAnzahl der Grossbuchstaben: %d", gb);
    		printf ("\nAnzahl der Zahlen: %d", z);
    
    		printf("\nZum Beenden die @ - Taste druecken, beliebige Taste zum weitermachen");
    		c = _getch ();
    		printf ("%c");
    
    		i = 0;
    		k = 0;
    		j = 0;
    		gb = 0;
    		z = 0;
    
    		system ("cls");
    
    }while (c != 64);
    
    return 0;
    }
    

    Meine Idee war, dass ich einen String in all einlese, die ersten 10 Zeichen str zuweise und die restlichen Zeichen rest.
    Aber irgendwie klappt das nicht, wie ich mir das vorstelle 🙂 .

    Wo könnte denn der Fehler liegen?
    Danke schonmal für eure Hilfe.


  • Mod

    mr.berg schrieb:

    Aber irgendwie klappt das nicht, wie ich mir das vorstelle 🙂 .

    Soso.

    Wo könnte denn der Fehler liegen?

    In deinem Programm.

    Und die Moral von der Geschichte: Vage Aussagen bringen einen nicht wirklich weiter.



  • Aber du bist nicht der erste der dieses Problem lösen muss:
    Gerade gestern gabs die gleiche Frage.

    gets_s() erwartet auch 2 Parameter. Dann nimm aber lieber fgets() , das ist im C-Standard.

    Und wenn du '@' meinst, dann kannst du das auch hinschreiben:

    while (c != 'q');
    


  • Natürlich ist

    while (c != '@');
    

    gemeint.

    Das Ganze gilt auch für if (int (h) > 64 && int (h) < 91){
    Das int ist auch nicht nötig. Mach lieber aus dem h ein int (statt char).

    if (h >= 'A' && h <= 'Z')
    

    Da sieht man sofort was gemeint ist.



  • Danke für den Tipp, wusste ich aber schon ;), werd das aber ab jetzt beherzigen.

    Habs inzwischen rausbekommen es lag am gets_s, hab jetzt das normale gets benutzt und zusätlich noch die strings vor der ersten Scheife die strings null terminiert, schon hats geklappt.



  • mr.berg schrieb:

    Habs inzwischen rausbekommen es lag am gets_s, hab jetzt das normale gets benutzt

    Tja, der 2. Parameter fehlte.
    Da muss der Compiler auch gemeckert haben. Auch wenn es "nur" eine Warnung ist.

    Und nimm fgets(). Da musst du auch die Länge des Puffers mit übergeben.

    Wenn bei dir der Nutzer mehr als 100 Zeichen eingibt, hast du Probleme.


Anmelden zum Antworten