Kleinbuchstaben Groß Schreiben Array Segmentation Fault



  • Hallo, haben vor einigen Tagen in der Schule angefangen mit C zu programmieren und bekamen die Aufgabe bei einem beliebigen Wort jeden Buchstaben groß zu schreiben. Habe das beispielsweise mit dem Wort hallo versucht jedoch bekommen ich beim Ausführen immer einen Segmentation Fault.

    #include <stdio.h>
    int i;
    int main ()
    {
      char* str ="Hallo";
      printf("%s", str);
      for (i = 0; str[i] != '\0'; i++)
      {
        switch (str[i])
         {
            case ('a') : str[i] = 'A';
            case ('l') : str[i] = 'L';
            case ('o') : str[i] = 'O';
            case ('H') : str[i] = 'H';
         }
      }
      printf("%s", str);
      return 0;
    }
    

    Die beiden printf Befehle wären nur zur Kontrolle da, verstehe aber nichtmal warum er den ersten schon nicht ausgibt, wo ich nichtmal irgendwas am Array getan habe.

    Frage: Warum bekomme ich einen Segmentation fault?

    Danke im Vorraus



  • Bei dir ist das str ein Zeiger auf ein Stringliteral. Die kannst du nicht verändern.
    Mach ein Array daraus und es geht:

    char str[] ="Hallo"; // Ja, leere Klammern. Der Compiler zählt besser als du.
    

    Und wenn du nicht toupper aus ctype.h nehmen darfst kannst du das besser berechnen:

    Denn in C kann man auch mit Buchstaben rechnen:

    Pseudo-

    Wenn Buchstabe >= 'a' und Buchstabe <= 'z' dann
      Buchstabe = Buchstabe - 'a' + 'A'
    

    Pssst: Wenn du voraus schreibst, gibt es keine ******



  • Und noch einen Tipp von mir :), nach jedem case würde ich ein break; setzten. Also:

    case 'a' : str[i] = 'A'; break;
    case 'l' : str[i] = 'L'; break;
    case 'o' : str[i] = 'O'; break;
    case 'H' : str[i] = 'H'; break;
    


  • holux schrieb:

    ..., verstehe aber nichtmal warum er den ersten schon nicht ausgibt, wo ich nichtmal irgendwas am Array getan habe.

    Dann gib mal ein '\n' mit aus:

    printf("%s\n", str);
    

    oder nimm puts:

    puts(str);
    

Anmelden zum Antworten