Wie kann ich in C Vokale eines eingegebenen Wortes mit eingegebenem Buchstaben substituieren?

2 Antworten

öhm, also du hast ja schon arrays

for(i=0; i<40;i++){
   if(str[i] == Vokale[1]) {
   }
}

hier müstest du allerdings noch eine for schleife bzw while schleife zusätzlich schachteln, weil du willst ja einmal alle 40 durchgehen und es mit allen jeweils vergleichen

for(i=0; i<40;i++){
   for(v=0; v<10;v++){
       if(str[i] == Vokale[v]) {
         str[i] = substitut[0];
       }
   }
}
wh1t312101 
Fragesteller
 27.10.2021, 10:19

Vielen, lieben Dank!:D Dachte schon irgendwie ich werd noch blöd, aber dann war ich gar nicht so weit weg:D

0
wh1t312101 
Fragesteller
 27.10.2021, 10:40

Eine kleine Frage hätte ich noch, falls Sie noch da sind: Was müsste ich an diesem Code ändern, um bspw. von einem eingelesenen Wort alle Großbuchstaben in Kleinbuchstaben umzuwandeln und umgekehrt?:) #include <stdio.h>

int main(int argc, char *argv[]) {

int i, j;

char str[40];

char kleinBuchstaben[27] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r','s','t', 'u', 'v', 'x', 'y', 'z'};

char großBuchstaben[27] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};

scanf(" %s", &str[0]);

for(i=0; i<40;i++){

for (j=0; j<26; j++) {

if(str[i] == kleinBuchstaben[j]) {

str[i] = großBuchstaben[j];

} else if(str[i] == großBuchstaben[j]) {

str[i] = kleinBuchstaben[j];

}

}

}

printf(" %s", str);

return 0;

}

0
TechPech1984  27.10.2021, 10:42
@wh1t312101

erstmal lernst du das in einem codeblock zu setzen wenn du code hast und dann einzurücken so das man das auch lesen kann . und erst dann werde ich antworten .

code block </> bei dem Tt zeichen zu finden .

danke .

0
wh1t312101 
Fragesteller
 27.10.2021, 10:46
@TechPech1984
#include <stdio.h>

int main(int argc, char *argv[]) {

    int i, j;

char str[40];

char kleinBuchstaben[27] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r','s','t', 'u', 'v', 'x', 'y', 'z'};

char großBuchstaben[27] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};

scanf(" %s", &str[0]);

for(i=0; i<40;i++){ 

    for (j=0; j<26; j++) { 

        if(str[i] == kleinBuchstaben[j]) {
            str[i] = großBuchstaben[j];
    } else if(str[i] == großBuchstaben[j]) {
        str[i] = kleinBuchstaben[j];
    }

    


    }



}

printf(" %s", str);

    return 0;
}

//war mir nicht bekannt, dass es ein solches Feature gibt


0
TechPech1984  27.10.2021, 10:49
@wh1t312101

sieht doch richtig aus , bis auf das du wenn du arrays mit 27 elementen hast , dann auch <27 schreiben solltest weil das sind dann von 0 bis 26 , halt 27 elemente . oder du hast nur 26 buchstaben , dann ist es auch nur char[26] dann entsprechend <26

0
wh1t312101 
Fragesteller
 27.10.2021, 10:52
@TechPech1984

Der Compiler (in meinem Fall CodeRunner für Visual Studio Code und der Online GDB Debugger) geben mir dann zwar das Wort korrekt aus (bspw. Hallo) allerdings mit Anhang: hALLOZZZ�b���uZZZZZZZZZZ�@���uZZPI-��ZZ

0
TechPech1984  27.10.2021, 10:55
@wh1t312101

tja wenn du ein char[40] aufmachst und aber nur Hallo schreibst , dann ist es auch kein char[40] dann ist es ein char[5] .

und da du die anderen werte vorher nicht auf 32 (ASCII für leerzeichen) gesetzt hast, zeigt er dir halt da irgendwelche zeichen an .

gnerell sollte man sachen auch mit anfangswerten belegen und nciht nur speicher belegen .

0
TechPech1984  27.10.2021, 10:58
@TechPech1984

oder ein \n nach dem letzen zeichen , dann wird meist bei ausgabe auch das ende erkannt .

0
wh1t312101 
Fragesteller
 27.10.2021, 11:03
@TechPech1984

Sorry für die permanente Fragerei: Ich wollte per char[40] die maximale Länge der einzugebenen Zeichenkette bestimmen.

Und welche Werte meinen Sie genau bzw. Leerzeichen?

0
TechPech1984  27.10.2021, 11:11
@wh1t312101

wir reden hier du unter programmierern ;)

also wenn du char[40] machst, dan reservierst du speicher für 40 zeichen

die sind dann aber noch mit irgendwelchen werten gefüllt .

wenn du vorher eine schleife machst wo alle 40 zeichen mit einem leerzeichen belegt werden , dann würden auch alle 40 zeichen nichts anzeigen .

ASCII ist eine zeichentabelle , weil computer kennen keine zeichen die arbeiten mit zahlen , wobei ein A den ASCII wert 65 hat und ein Leerzeichen den ASCII wert 32 hat . such einfach mal nach ASCII tabelle bzw auch bei wikipedia zu lesen.

deine print anweisung %s gibt alles aus bis ein ende zeichen kommt . \0 terminierungszeichen dann weiss die ausgabe , hier ist sschluss , ansonsten gibt es natürlich einfach die 40 zeichen aus , und da du sie nicht initialisiert hast mit leerzeichen , passiert halt ds was du da siehst

Was ist eine Initialisierung ?
Die erstmalige Zuweisung eines Wertes an eine Variable wird als  Initialisierung bezeichnet. Sie kann zusammen mit der Deklaration oder getrennt davon erfolgen.

hier mal das mit dem terminierungszeichen erklärt

https://www.c-howto.de/tutorial/strings-zeichenketten/nullterminiert/

0
wh1t312101 
Fragesteller
 27.10.2021, 11:44
@TechPech1984
/*Also ich habe nun eine for-Schleife vorgeschalten, welche die reservierten Zeichen ,,leert'', allerdings wird noch immer ein Zeichen zu viel ausgegeben und wenn ich die Schleife um einen Durchlauf reduziere kommt die Meldung: Stack smash detectected oder es wird fehlerhaft angezeigt*/

#include <stdio.h>

int main(int argc, char *argv[]) {

    int i, j;

char str[40];

for(i=0; i<40;i++) {
    str[i] = 32;
}

char kleinBuchstaben[26] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r','s','t', 'u', 'v', 'x', 'y', 'z'};

char grossBuchstaben[26] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};

scanf("%s", &str[0]);

for(i=0; i<40;i++){ 


    for (j=0; j<26; j++) { 

        if(str[i] == kleinBuchstaben[j]) {
            str[i] = grossBuchstaben[j];
    } else if(str[i] == grossBuchstaben[j]) {
        str[i] = kleinBuchstaben[j];
    }

    



        
    }

    }

printf("%s", str);

    return 0;
}

0
wh1t312101 
Fragesteller
 27.10.2021, 12:04
@wh1t312101

Hat sich erledigt war nur eine Kleinigkeit:D Vielen Dank für DEINE Zeit und Geduld:D

1

Ich kenn mich mehr mit Java aus und weiß jetzt nicht ob es sowas ähnliches wie eine replace() Methode für Strings gibt, der man das Zeichen das ersetzt werden soll übergibt und das Zeichen durch welches es ersetzt werden soll. Jedenfalls wenn es sowas gibt hätte ich eine ziemlich einfache Lösung:

public static void main(String[] args) {

// TODO Auto-generated method stub

int zähler=0;

Scanner s = new Scanner (System.in);

String wort,substituiert="";

String [] vokale = {"a","e","i","o","u","A","E","I","O","U"};

System.out.println("Bitte geben Sie das Wort ein, welches substituiert werden soll");

wort=s.next();

while(zähler<=vokale.length-1)

{

wort=wort.replace(vokale[zähler], "p");

zähler++;

}

System.out.println(wort);

}

Diesen zweiten String substituiert kann man auch weglassen der wird nicht verwendet.

TechPech1984  27.10.2021, 10:43

ich glaub er ist noch bei übungen . wenn er dann die nächsten befehle kennen lernt , ist deins hilfreich . c ist da selten gnädig, da macht man viel zu fuss was java einfach bei seinen objekten in der klasse schon hat .

0