Unser neuestes Mitglied: huanbengel

137 Besucher derzeit online [ Zeigen ]

Startseite | Werbefreies Forum: Jetzt Mitglied werden! | Login | Team | Suchen
Statistik | Hilfe / FAQ | Regeln
Willkommen auf dem xpBulletin Board, Gast.
Du bist nicht registriert oder eingeloggt.
Dein Letzter Besuch war am: 18.07.2018, 16:51 Uhr.
[ Alles als gelesen markieren ]
xpBulletin Board » Programmierung » C und C++ - Forum » String Array in C mit Funktion
Benutzer im Forum aktiv: Keine

[ Neue Antwort ]


Autor
Thema: String Array in C mit Funktion

 

Seiten (1): [1]

Neuer Beitrag 03.12.2014, 02:24
 String Array in C mit Funktion

#1 | Zitieren |

tommy71 ist Offline tommy71
Code Reuser
Hallo liebe Forum Mitglieder!

Ich hänge wieder einmal bei einem C Problem.

Bei Progammaufruf soll ein Wort eingegeben werden und ein Buchstabe, der in dem Wort gesucht wird. Das ganze soll mit einem Hauptprogramm und einer Funktion dargestellt werden. Und gerade bei der Funktion hänge ich. Wie löse ich die Funktionsaufruf?

#include<stdio.h>

unsigned Buchstabenvergleich(char* str,char ch) {
int count = 0, i;
for (i = 0; str != ''; i++) {
if (str[i] == ch)
count++;
}
if (count == 0)
printf("nDen Buchstaben '%s' gibt es nicht", ch);
else
printf("nDen Buchstaben '%s' gibt es: %d mal", ch, count);

return 0;
}

int main() {
char str[30], ch;

printf("nGeben Sie ein Wort ein: ");
scanf("%s", &str);
printf("Welcher Buchstabe soll gesucht werden?: ");
scanf("%s", &ch);
Buchstabenvergleich(str,ch);
}

Ausgabe:
Geben Sie ein Wort ein: Test
Welcher Buchstabe soll gesucht werden?: t
Segmentation fault (Speicherabzug geschrieben)

[i]Beitrag editiert von tommy71 am 03.12.2014, 02:27
 Beiträge: 8 | Punkte: 12 | Wohnort: Wien | Registriert seit: 1350 Tagen (Nov 2014)
 
Neuer Beitrag 03.12.2014, 02:24
 Werbung

AdBot
Mister Ad

 
Neuer Beitrag 03.12.2014, 11:22
 Re: String Array in C mit Funktion

#2 | Zitieren |

Ark ist Offline Ark
Zen Master Foo



Geschlecht: Männlich
Was willst du denn mit unsigned [FUNKTIONSNAME] sagen?

~ Xenoblade ~
 Beiträge: 5.490 | Punkte: 3.353 | Wohnort: ... | Registriert seit: 4756 Tagen (Jul 2005)
 
Neuer Beitrag 03.12.2014, 11:22
 Werbung

AdBot
Mister Ad

 
Neuer Beitrag 03.12.2014, 11:50
 Re: String Array in C mit Funktion

#3 | Zitieren |

trouff ist Offline trouff
Ancient Hacker
Hi,

also dein Problem verstehe ich nicht wirklich. Was meinst du mit wie löse ich den Funktionsaufruf? Kannst du das genauer erklären? Ist dein Problem wie die Funktion aufgerufen wird oder wie die Funktion selbser gestaltet werden muss(Parameterliste)?

Sonstige Anmerkungen:
str != '' -> Keine Ahnung ob das Funtioniert, aber im allgemeinen endet ein String-Array auf '', was hieße du könntest darauf prüfen. Ich würde allerdings um die Lesbarkeit zu verbessern gar nicht direckt mit dem char arbeit sondern zuerst die Länge der Zeichenkette bestimmen mit:

size_t strlen(const char *s);

und dann das als Abbruchbedingung nutzen!

Mfg trouff

P.S.: @ Ark: Ist deine Frage was unsigned für ein Datentyp ist? Oder was verstehst du nicht? Das das ganze die Funktiondefinition ist scheinst du ja selber herausgefunden zu haben.

Beitrag editiert von trouff am 03.12.2014, 11:54
 Beiträge: 932 | Punkte: 1.216 | Wohnort: pillepallearschgekna | Registriert seit: 4731 Tagen (Aug 2005)
 
Neuer Beitrag 03.12.2014, 18:27
 Re: String Array in C mit Funktion

#4 | Zitieren |

tommy71 ist Offline tommy71
Code Reuser


Themenstarter/in
Hallo,

das Programm soll aus einen Hauptteil bestehen, in dem ein Wort eingegeben wird und ein Buchstabe, der in diesem Wort gefunden werden soll. Es soll ausgegeben werden, wie oft dieser Buchstabe in dem Wort vorkommt. Mein Problem besteht nun darin, wie gestalte ich den Funktionsaufruf von

'Buchstabenvergleich(str,ch);'

nach 'unsigned Buchstabenvergleich(char* str,char ch)'

Die Funktion des Programms sollte wie folgt sein. Man gibt z.B. "Test" und "t" ein und erhält als Ausgabe: "Den Buchstaben t gibt es 1 mal"

LG tommy
 Beiträge: 8 | Punkte: 12 | Wohnort: Wien | Registriert seit: 1350 Tagen (Nov 2014)
 
Neuer Beitrag 03.12.2014, 18:29
 Re: String Array in C mit Funktion

#5 | Zitieren |

tommy71 ist Offline tommy71
Code Reuser


Themenstarter/in
wharscheinlich gehört statt 'unsigned Buchstabenvergleich(char* str,char ch)' schonmal 'char Buchstabenvergleich(char* str,char ch)'?
 Beiträge: 8 | Punkte: 12 | Wohnort: Wien | Registriert seit: 1350 Tagen (Nov 2014)
 
Neuer Beitrag 03.12.2014, 19:00
 Re: String Array in C mit Funktion

#6 | Zitieren |

trouff ist Offline trouff
Ancient Hacker
tommy71 schrieb:
wharscheinlich gehört statt 'unsigned Buchstabenvergleich(char* str,char ch)' schonmal 'char Buchstabenvergleich(char* str,char ch)'?



ne, im prinzip ist unsigned schon richtig! Du könntest auch int nehmen. Char ist sogar auch möglich, da ein char im Prinip nichts anderes ist als ein int.

Aber dein Grundproblem verstehe ich immer noch nicht, da du einfach nochmal deine Frage wiederholt hast, statt genauer zu erklären.

Geht es dir jetzt um die Funktionsdefinition oder um den Funktionsaufruf? Wo ist genau dein Problem?

Mfg trouff
 Beiträge: 932 | Punkte: 1.216 | Wohnort: pillepallearschgekna | Registriert seit: 4731 Tagen (Aug 2005)
 
Neuer Beitrag 03.12.2014, 19:17
 Re: String Array in C mit Funktion

#7 | Zitieren |

tommy71 ist Offline tommy71
Code Reuser


Themenstarter/in
Im Funktionsaufruf muss irgendwo ein Fehler sein, da ich die Fehlermeldung

"Segmentation fault (Speicherabzug geschrieben)" bekomme.

Das Ergebnis meines Programmaufruf sieht folgendermaßen aus:

Geben Sie ein Wort ein: Test
Welcher Buchstabe soll gesucht werden?: t
Segmentation fault (Speicherabzug geschrieben)
 Beiträge: 8 | Punkte: 12 | Wohnort: Wien | Registriert seit: 1350 Tagen (Nov 2014)
 
Neuer Beitrag 03.12.2014, 20:58
 Re: String Array in C mit Funktion

#8 | Zitieren |

trouff ist Offline trouff
Ancient Hacker
Versuch den Funktionsaufruf mal mit &str ->

Code:

Buchstabenvergleich(&str,ch);



Mfg trouff

P.S.:
Falls ich dir noch ein paar Tipps geben darf:

Programmiere englisch:
Versuche wenn möglich auf englisch zu programmieren. Wenn du nicht so gut darin bist ist es ein Grund es parallel zu lernen. Denke daran, dass viele Quellen für diesen Bereich einfach auf Englisch geschrieben sind. Englisch programmieren hat verschiedene Vorteile.
Falls du z.B.: in einer anderen Community nach hilfe suchen möchtest, dann kannst du deinen Code direkt so wie er ist in deinen Beitrag einfügen ohne ihn vorher übersetzen zu müssen. Ein anderer Vorteil ist die Arbeit im Team. Das scheint zwar jetzt gerade noch nicht so wichtig, aber falls du mal sinnvolle Dinge per Code umsetzen möchtest, dann wirst du wahrscheinlich in einem Team zusammenarbeiten und da ist die Sprache der Wahl oft englisch.

Codestyle:
Versuche Funktionsnamen klein zu schreiben. Das hat sich einfach so eingebürgert und wird von vielen Programmierern so gehandhabt. Das macht es dann, falls du noch zu einer Objektorietierten Programmiersprache wie C++, c# oder Java umsteigen solltest auch einfacher Funktionen von Klassen zu unterscheiden.

Versuche Funktionen den bestmöglichen Namen zu geben. In deinem Fall wäre das vielleicht:
Code:

getCharCount 
countCharInWord


oder Ähnlich. Den perfekten Namen wirst du wahrscheinlich nicht finden, aber vielleicht einen der sehr gut ist.

Beitrag editiert von trouff am 04.12.2014, 01:00
 Beiträge: 932 | Punkte: 1.216 | Wohnort: pillepallearschgekna | Registriert seit: 4731 Tagen (Aug 2005)
 
Neuer Beitrag 06.12.2014, 01:58
 Re: String Array in C mit Funktion

#9 | Zitieren |

Pui ist Offline Pui
Senior Developer

Geschlecht: Männlich
Code:

01 #include<stdio.h>
02
03 unsigned Buchstabenvergleich(char* str,char ch) {
04     int count = 0, i;
05     for (i = 0; str != ''; i++) {
06         if (str == ch)
07         count++;
08     }
09     if (count == 0)
10         printf("nDen Buchstaben '%s' gibt es nicht", ch);
11     else
12         printf("nDen Buchstaben '%s' gibt es: %d mal", ch, count);
13
14     return 0;
15 }
16
17 int main() {
18     char str[30], ch;
19
20     printf("nGeben Sie ein Wort ein: ");
21     scanf("%s", &str);
22     printf("Welcher Buchstabe soll gesucht werden?: ");
23     scanf("%s", &ch);
24     Buchstabenvergleich(str,ch);
25 }



Ich weiß nicht, ob das noch relevant ist, aber hier ein paar Gedanken:

Zuerst etwas allgemeines.
- Pro Zeile ein Statement. Das ist einfach viel übersichtlicher und spart dir eine Menge Fehler, die man ansonsten leicht übersieht. D.h. aus [i]int count = 0, i; sollte das hier werden:
int count = 0;
int i;

- Schleifenvariablen, wie das o.g. i kann man auch einfach innerhalb des Schleifenkopfes deklarieren/initialisieren. z.B. so: for(int i = 0; i < ....) { ... }. Dadurch hat man nicht so viel Code außenrum, der nur ablenkt.

- Genau wie trouff schon geschrieben hat, sollte man sich an die aktuellen naming conventions halten (z.b. Funktionen werden in camelCase geschrieben mit kleinem Anfangsbuchstaben) und am besten auch in Englisch programmieren.


Nun zu deinem Code:
Zuerst solltest du dir überlegen, warum deine Funktion überhaupt einen Rückgabewert hat, obwohl sie doch garnichts sinnvolles zurückgibt. Du solltest also das unsigned durch void tauschen (und dann auch das return 0 am Ende der Funktion löschen).
Dadurch wird die Funktionssignatur zu: void buchstabenVergleich(char* str, char ch).
Der Aufruf der Funktion bleibt gleich.

Der Grund, warum du ein Segmentation Fault bekommst, ist, weil du in Zeile 10 und 12 auf einen ungültigen Speicherbereich zugreifen willst. Zum Beispiel Zeile 10: printf("nDen Buchstaben '%s' gibt es nicht", ch);.
Du sagst printf, dass es einen String ausgeben soll (%s), übergibst aber einen einzelnen Character (ch). Printf gibt also alles im Speicher aus, was zwischen ch und dem nächsten c-string-ende ('\0') liegt. Dummerweise hört die Variable ch bereits nach einem Byte/Zeichen auf und printf greift anschließend unzulässigerweise auf einen Speicherbereich zu, der dir nicht gehört.
Lösung: %s durch %c ersetzen. Genauso in Zeile 12.



Damit bleiben nur noch zwei kleine Probleme in deiner Main-Methode.

In Zeile 21 ließt du ein Wort/String ein. Dein Buffer/Array ist 30 lang. Schon mal probiert mehr als 30 Zeichen einzugeben? Genau, das führt letztendlich zu einem Bufferoverflow, weil einfach über das Ende von str hinausgeschrieben wird. Helfen kannst du die hier, in dem du scanf sagst, wieviele Zeichen maximal eingelesen werden sollen: scanf(%29s", &str);. Warum 29 und nicht 30? Es muss schließlich noch Platz für den String-Terminator ('\0') bleiben. Der wird automatisch hinzugefügt.

In Zeile 23 willst du einen einzelnen Char einlesen. Das "%s" solltest du deshalb zu " %c" ändern (Die Leerstelle am Anfang ist Absicht, weil scanf ansonsten vorherige Whitespaces mitnehmen könnte. Das führt dann dazu, dass es nichts einliest. Scanf ist keine besonders schöne Funktion)

Hoffe, das hilft dir weiter.


Das nächste mal könntest du den Quellcode auch mit [.code][./code] und ordentlicher Einrückung posten, dann kann auch was erkennen

Beitrag editiert von Pui am 06.12.2014, 02:18
 Beiträge: 87 | Punkte: 130 | Wohnort: heaven | Registriert seit: 4414 Tagen (Jun 2006)
 
Neuer Beitrag 06.12.2014, 18:12
 Re: String Array in C mit Funktion

#10 | Zitieren |

trouff ist Offline trouff
Ancient Hacker
Hallo Pui,

schön das es doch noch ein paar Technik/programmier-affine Menschen hier im Forum gibt. Außerdem ein schnöner Beitrag den du da verfasst hast.

Pui schrieb:


- Schleifenvariablen, wie das o.g. i kann man auch einfach innerhalb des Schleifenkopfes deklarieren/initialisieren. z.B. so: for(int i = 0; i < ....) { ... }. Dadurch hat man nicht so viel Code außenrum, der nur ablenkt.




Hier gibt es allerdings compiler, die das nicht mögen soweit ich das weiß(C89-Standard z.B. soweit ich mich richtig erinnere). Ich hab auch schon mit anderen Programmieren gearbeitet, die es lieber hatten, wenn man alle Variable am Funktionsanfang deklariert. Ich sehe es allerdings auch so wie du. Wenn es möglich ist, dann ist die deklaration von i innerhalb der Schleifenkopfes schöner. Da dieses Konstrukt auch so oft eingesetzt wird sollte es auch so besser lesbar sein.

Pui schrieb:


Nun zu deinem Code:
Zuerst solltest du dir überlegen, warum deine Funktion überhaupt einen Rückgabewert hat, obwohl sie doch garnichts sinnvolles zurückgibt. Du solltest also das unsigned durch void tauschen (und dann auch das return 0 am Ende der Funktion löschen).
Dadurch wird die Funktionssignatur zu: void buchstabenVergleich(char* str, char ch).
Der Aufruf der Funktion bleibt gleich.



Das tommy beim return nur ne 0 zurückgibt nehme ich an liegt an der fehlenden Kenntnis, wozu ein return dient. Aber ich nehme fast an, dass wir das nie erfahren werden, weil der TE wahrscheinlich erst bei seiner nächsten Frage hier zum Forum zurückkehren wird.

Falls Tommy hier doch noch mitlesen sollte. Eine einfache Meldung ala "Jups, danke hat geklappt" wäre super. Dann wissen auch zukünftige Menschen, die auf diesen Thread stoßen, ob das vorgeschlagene eine Lösung des Problems ist.

Mfg trouff
 Beiträge: 932 | Punkte: 1.216 | Wohnort: pillepallearschgekna | Registriert seit: 4731 Tagen (Aug 2005)
 
Neuer Beitrag 06.12.2014, 18:12
 Werbung

AdBot
Mister Ad

 
Neuer Beitrag 09.12.2014, 11:50
 Re: String Array in C mit Funktion

#11 | Zitieren |

Ark ist Offline Ark
Zen Master Foo



Geschlecht: Männlich
@touff: Allgemein. Was will er damit? Der Aufruf nämlich ist so, dass nichts von der Funktion an das Hauptprogramm übergeben wird. Normalerweise will man das ja gleich ausgeben, in ne Variable speichern oder als if-Bedingung gleich vergewaltigen. Die Deklaration (Definition in dem Fall zugleich) ist aber eigentlich mit Rückgabewert. Zumindest stimmt dann das return 0 halbwegs. Wobei man return 0 nur im Hauptprogramm (int main) machen sollte.

Der Rest wurde ja schon gesagt.

~ Xenoblade ~
 Beiträge: 5.490 | Punkte: 3.353 | Wohnort: ... | Registriert seit: 4756 Tagen (Jul 2005)
 
Neuer Beitrag 09.12.2014, 12:47
 Re: String Array in C mit Funktion

#12 | Zitieren |

trouff ist Offline trouff
Ancient Hacker
Ark schrieb:
@touff: Allgemein. Was will er damit? Der Aufruf nämlich ist so, dass nichts von der Funktion an das Hauptprogramm übergeben wird. Normalerweise will man das ja gleich ausgeben, in ne Variable speichern oder als if-Bedingung gleich vergewaltigen. Die Deklaration (Definition in dem Fall zugleich) ist aber eigentlich mit Rückgabewert. Zumindest stimmt dann das return 0 halbwegs. Wobei man return 0 nur im Hauptprogramm (int main) machen sollte.



Hi Ark,

nicht ganz sicher ob ich dich komplett verstanden habe, aber ich schätze dein Beitrag bezog sich auf den Rückgabewert?!

Also wie gesagt gehe ich davon aus, dass das mit dem return entweder nicht verstanden worden ist oder durch das Testen verschiedener Lösungen einfach als überbleibsel stehengeblieben ist. Aber natürlich hat das return 0, so wie es gerade angwendet wird nur wenig Sinn.

Ich hätte das Problem insgesamt anders gelöst in dem ich eine Methode implementiere, die nur für das Zählen verantwortlich ist.

z.B.:
Code:

int countNumberOfCharInWord(char c, char* string);



Und die Ausgabe des Ergebnisses passiert dann entweder in der Main Methode oder in einer weiteren Methode, die dafür vorgesehen ist eine formatierte Ausgabe vorzunehmen.

z.B.:

Code:

void printNumberOfCharInWord(char c, char* string);



Die hat dann aber keinen Rückgabewert!
Das wäre meiner Meinung die eleganteste Lösung!

Mfg trouff

P.S.: Ich finde ein return auch in einer normalen Funktion nicht unheimlich ungewöhlich, wenn wir mal davon absehen, dass man Konstanten nicht einfach so im Code herumfliegen haben sollte(Magic numbers!). Was wäre z.B. wenn der angegebene Char nicht im Wort vorkommt? return 0!

Beitrag editiert von trouff am 09.12.2014, 12:54
 Beiträge: 932 | Punkte: 1.216 | Wohnort: pillepallearschgekna | Registriert seit: 4731 Tagen (Aug 2005)
 
Neuer Beitrag 09.12.2014, 13:55
 Re: String Array in C mit Funktion

#13 | Zitieren |

Ark ist Offline Ark
Zen Master Foo



Geschlecht: Männlich
Mir ging es um diesen Mischmasch. Wenn man den Funktionsaufruf so macht wie der Threadersteller, dann ist void eigentlich Pflicht.

~ Xenoblade ~
 Beiträge: 5.490 | Punkte: 3.353 | Wohnort: ... | Registriert seit: 4756 Tagen (Jul 2005)
 
Neuer Beitrag 09.12.2014, 13:55
 Werbung

AdBot
Mister Ad

Seiten (1): [1]

  

xpBulletin Board » Programmierung » C und C++ - Forum » String Array in C mit Funktion

[ Neue Antwort ]


Heute ist der 18.07.2018, 16:51 Uhr

Sämtliche Beiträge geben die Meinung des jeweiligen Verfassers wieder.
Für den Inhalt der Beiträge sind ausschließlich die Autoren verantwortlich.


Powered by: xpBulletin Board Version 2.3.0
Generiert in 0.0482 Sekunden
« Übersicht | @Twitter | @Facebook | Sitemap | Impressum »