Anfangsbuchstaben aller Wörter in einem String groß schreiben



  • Hi,

    ich bin neu angemeldet und freue mich schon auf einen guten Informationsaustausch.

    Vor etwa einer Woche habe ich angefangen, mich durch ein C-Tutorial zu arbeiten.

    Bearbeitet habe ich u.A: Variablen, Benutzerinteraktionen, Verzweigungen, Schleifen, Arrays, Strings

    Nun versuche ich momentan einen String auszugeben, bei dem die Anfangsbuchstaben aller Wörter groß ausgeschrieben werden sollen. Ich habe, wie schon bei anderen String-Aufgaben Schleifen genutzt und bekomme momentan jedoch trotz intensiver Bemühungen kein Ergebnis. Zunächst bestimme ich für den Anfangsbuchstaben des gesamten Strings, dass dieser immer groß geschrieben werden muss. Danach soll jeder Buchstabe, welcher nach eine Leerzeichenstelle kommt genauso überprüft werden, wie der erste.

    Hier der Quelltext:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main() {
    
    char string[40] ="Dieser Satz muss veraendert werden.";
    
    int len = strlen(string);
    
    int i;
    
    if(string[0]>='a' && string[0]<= 'z') { string[0] -= 32;}
    
    for(i=0; i<len; i++) {
    
    	if((string[i] == ' ') || (string[i+1]>='a' && string[i+1]<= 'z')) {
    
    		string[i+1] -= 32;
    
    		}		
    	}				
    
    printf("%s", string);
    
    	return 0;
    
    }
    

    Momentan werden alle Buchstaben um 32 nach hinten versetzt, wodurch man folgendes Ergebnis bekommt:

    "DIESER 3ATZ MUSS VERAENDERT WERDEN."

    Ich hoffe Ihr könnt mir weiterhelfen. 🙂



  • Die Bedingung beim if ist verkehrt

    Überleg mal selber ob das richtig ist:
    "Wenn da ein Leerzeichen oder das nächste Zeichen ein Kleinbuchstabe ist, dann ..."

    Schau dir mal die Funktionen aus ctype.h an.
    Die machen dir das Leben etwas leichter.

    Noch besser ist es, wenn du dir einfach merkst, ob du gerade Leerzeichen gefunden hast um dann im nächsten Durchlauf darauf zurück zu greifen.



  • Danke für den Hinweis mit <ctype.h>. Hat mir sehr geholfen : 😋



  • /* main.c */
    #include <stdlib.h>
    #include <stdio.h>
    #include <ctype.h>
    #include <string.h>
    
    int main(void) {
    	char str[40] = "Dieser Satz muss veraendert werden.";
    
    	int i, len, new_word;
    	len = strlen(str);
    	new_word = 1; /* TRUE */
    
    	printf("alt: %s\n", str);
    	for (i = 0; i < len; i++) {
    		if (new_word) {
    			str[i] = toupper(str[i]);
    			new_word = 0; /* FALSE */
    		} else {
    			if (isspace(str[i])) {
    				new_word = 1; /* TRUE */
    			}
    		}
    	}
    
    	printf("neu: %s\n", str);
    	return EXIT_SUCCESS;
    }
    

    - ignoriert alle Whitespaces
    - nach Whitespace: Nächstes Zeichen ändern wenn es ein Buchstabe ist



  • Wenn der Text mit einem Leerzeichen anfängt, klappt es nicht 😞



  • War ich wieder zu schnell und hab wieder nicht richtig nachgedacht -.- Danke für den Hinweise. Hier eine korrigierte Version, hoffentlich diesmal ohne Fehler.

    /* main.c */
    #include <stdlib.h>
    #include <stdio.h>
    #include <ctype.h>
    #include <string.h>
    
    /**
     * Anfangsbuchstaben aller Wörter groß
     * 
     */
    int main(void) {
    	char str[40] = " dieser &Satz 	 muss veraendert werden.";
    
    	int i, len, new_word;
    	len = strlen(str);
    	new_word = 1; /* TRUE */
    
    	printf("alt: %s\n", str);
    	for (i = 0; i < len; i++) {
    		if (isspace(str[i])) {
    			new_word = 1; /* TRUE */
    		} else if (new_word) {
    			str[i] = toupper(str[i]);
    			new_word = 0; /* FALSE */
    		}
    	}
    
    	printf("neu: %s\n", str);
    	return EXIT_SUCCESS;
    }
    


  • Der Code von enox stürzt bei mir ab. Die genaue Aufgabenstellung ist auch nicht ganz klar. Willst du nur die Anfangsbuchstaben in Großbuchstaben und den String ansonsten nicht anders ausgeben oder sollen auch die Leerzeichen reduziert werden? Auch am Anfang und am Ende?

    Dieser Code sollte funktionieren. Er entfernt alle Leerzeichen am Anfang und am Ende. Außerdem werden auch die Leerzeichen zwischen den Wörtern auf nur ein einziges beschränkt und die Anfangsbuchstaben der Wörter in Großbuchstaben ausgegeben.

    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    
    int main()
    {
    	char str[] = "  Dieser Satz       muss   veraendert   werden.  ";
    
    	int len = strlen(str);
    
    	int i = 0;
    
    	while (i < len)
    	{
    		for (; i < len; ++i)
    		{
    			if (str[i] != ' ')
    			{
    				putchar(toupper(str[i++]));
    
    				break;
    			}
    		}
    
    		for (;str[i] != ' ' && i < len; ++i) 
    			putchar(str[i]);
    
    		while (str[i] == ' ' && i < len)
    			++i;
    
    		if (i != len)
    			putchar(' ');
    	}
    }
    

    Man könnte statt der Ausgabe auch in einen neuen String schreiben bzw. diesen direkt verändern. Vielleicht poste ich hierfür später auch noch ein Beispiel.

    Der Code ist sicher nicht perfekt, aber sollte dafür problemlos funktionieren.



  • Wenn der String verändert werden soll und dir die Leerzeichen egal sind, dann hier noch schnell das andere Beispiel:

    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    
    int main()
    {
    	char str[] = "  Dieser Satz       muss   veraendert   werden.  ";
    
    	int len = strlen(str);
    
    	int i;
    
    	printf("Alt: '%s'\n", str);
    
    	for (i = 0 ;i < len; ++i)
    	{
    		if (str[i] != ' ')
    		{
    			str[i] = toupper(str[i]);
    
    			while (str[i] != ' ' && i < len)
    				++i;
    		}
    	}
    
    	printf("Neu: '%s'\n", str);
    }
    

    Ansonsten musst du genauer sagen, was du wirklich haben willst.



  • Der Fehler in dem Programm von enox liegt übrigens in dieser Zeile:

    char str[40] = " dieser &Satz    muss veraendert werden.";
    

    Der String passt nicht in ein Array mit 40 Zeichen. Als Folge ermittelt strlen blödsinn und das Programm greift auf ungültige Array-Elemente zu.

    Das Problem lässt sich umgehen, indem man einfach die Größe weglässt - der Compiler setzt die korrekte Größe dann selber ein. Alternativ die Zahl 40 auf die korrekte Zahl 41 ändern. Aber bei der nächsten Änderung gibts dann evtl. wieder Probleme, wenn die Größe nicht mehr passt, also lieber die feste Angabe weglassen.



  • '\0 vergessen mitzuzählen. Danke für den Tipp, werd ich mir merken.


Log in to reply