Wie kann ich in C Vokale eines eingegebenen Wortes mit eingegebenem Buchstaben substituieren?
Guten Tag,
ich lerne gerade die Programmiersprache C im Rahmen meine Studiums.
Ich hänge momentan an einer Aufgabe fest, bei der ich ein Programm schreiben soll, welches zwei Eingaben ausliest: Ein einzelner Buchstabe (z.B. ein p) und ein Wort (z.B. Hochschule).
Das Programm soll sämtliche Vokale des eingegebenen Wortes durch den eingegebenen einzelnen Buchstaben substituieren (im Beispiel also: Hpchschplp).
Mein Ansatz sah so aus:
#include <stdio.h>
int main(int argc, char *argv[])
{
int i;
char substitut[1], str[40];
char Vokale[11] = {'A', 'E', 'I', 'O', 'U', 'a', 'e', 'i', 'o', 'u'};
scanf(" %c %s", &substitut[0], &str[0]);
for (i = 0; i < 40; i++) {
if (str[i] == Vokale[1]) {
}
}
printf(" %s %s", substitut, str);
return 0;
}
Leider ist mir keine Möglichkeit bekannt, wie ich einzelne Zeichen in einer Zeichenkette ersetzen kann.
Ich würde mich riesig über eine Antwort freuen und danke im Voraus! 🙂
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];
}
}
}
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 .
#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
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
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
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 .
oder ein \n nach dem letzen zeichen , dann wird meist bei ausgabe auch das ende erkannt .
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?
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/
/*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;
}
Hat sich erledigt war nur eine Kleinigkeit:D Vielen Dank für DEINE Zeit und Geduld:D
Vielen, lieben Dank!:D Dachte schon irgendwie ich werd noch blöd, aber dann war ich gar nicht so weit weg:D
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.
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 .
übrigens arbeitet er mit char also primitive typen und nicht mit klassen ,
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;
}