Funktionen Probleme

Hallo ihr Experten,
ich hab dier drei Programme die nicht so funktionieren wie sie sollten. Kann mir jemand helfen?
Und mit was für ein Formatzeichen gibt man void an.
Z.B. int ist ja %d und float %d

Ich würde mich freuen wenn ihr mir helfen könntet.

Harald

Hier die Quelltexte:

Das Programm soll ausgeben wieviele Ziffern sich im String befinden

#include
int ZiffernAnzahl(char*s)
{
int i;

for(i=0;s[i]!=’\0’;i++)
if(*s>=‚0‘ && *s
char *ToUpper(char*s)
{
char i;

for(i=0;s[i]!=’\0’;i++)
if(*s>=‚a‘ && *s
char *Ersetze(char*s,char c,char d)
{
char i;

for(i=0;s[i]!=’\0’;i++)
if(*s==c: *s=d)
{
i++;
}

return i;
}

void main(void)
{
char s[255];
printf(„Bitte einen String eingeben:“);
gets(s);
printf("Der Buchstabe r wurde durch x ersetzt,*Ersetze(s,‚r‘,‚x‘));
}

Hallo ihr Experten,
ich hab dier drei Programme die nicht so funktionieren wie sie
sollten. Kann mir jemand helfen?
Und mit was für ein Formatzeichen gibt man void an.
Z.B. int ist ja %d und float %d

float = %f, %g, %e

Hi,
mal eben nachgekukkt:

Format Specifier
%a Liesst einen Fliesskommawert ein (nur C99)
%c Liesst einen einzelnen Character
%d Liesst einen dezimalen Integer
%i Liesst einen Integer im dezimaln, im oktalen oder im hexadezimaln Format
%e Liesst eine Fliesskommazahl
%f Liesst eine fliesskommazahl
%g Liesst eine Fliesskommazahl
%o Liesst eine Oktalzahl
%s Liesst einen String
%x Liesst eine Hexadezimalzahl
%p Liesst einen Zeiger
%n nimmt einen Integer-Wert entgegen, der gleich der Anzahl der bisher eingelesenen Zeichen ist
%u Liesst einen dezimalen integer ohne Vorzeichen
%[] Sucht nach einer Menge von charactern ab
%% Liesst ein Prozentzeichen

Li

Hi
dann wollen wir mal das ganze Zerlegen:

//Das Programm soll ausgeben wieviele Ziffern sich im String
//befinden

#include 
int ZiffernAnzahl(char\*s)
{
**Dir fehlt eine Variable, die die Anzahl der Zahlen zählt  
 'i' ist ja die Zählvariable der Schleife   
  
 int anzahl=0;**  

 int i;
 for(i=0;s[i]!='\0';i++)
 if(\*s\>='0' && \*sstatt i zu erhöhen nun die Zählvariable
 {
**anzahl** ++;
 }
 return i;
}
**Die main() funktioniert zwar so, aber der Standart schreibt einen  
Rückgabewert für die Hauptfunktion vor. Also statt 'void main()' , 'int main()' und am Schluß ein 'retrun 0;'**  
**int** main(void)
{
 char s[255];
 printf("Bitte einen String eingeben:");
 gets(s);
 printf("Es kommen in diesem String %d Ziffern vor\n",ZiffernAnzahl(s));
**return 0;**
}

für die Abfrage, ob das Zeichen eine Zahl ist, kannst Du auch die Funktion ‚int isdigit(char)‘ aus der ctype.h verwenden.
Ich hab mir auch mal Gedanken gemacht. Das ist bei mir dabei herausgekommen:

int ZiffernAnzahl(char \*wort)
{
 int anzahl=0;
 while(\*wort++) 
 if ( isdigit(\*wort) ) anzahl++;
 return anzahl;
}

Ich laß das ganze mal unkommentiert viel Spass beim nachvollziehen

Dieses Programm soll einen Text in Großbuchstaben umwandeln

#include 
char \*ToUpper(char\*s)
{
 char i;
**der Gedanke ist soweit ganz gut. Statt das Array abzugehen  
 derefenzierst Du immer nur das erste Element den \*s == s[0]  
 du zählst ja nicht den Zeiger weiter**  

 for(i=0;s[i]!='\0';i++)
 if(s**[i]**\>='a' && s**[i]**[i] -= 'a'-'A';
 }
 return s;
}
**int** main(void)
{
 char s[255];
 printf("Bitte einen String eingeben:");
 gets(s);

 **einen String gibt man mit printf so aus  
 printf("%s",zeiger\_auf\_string)**  
 printf("In Grossbuchstaben sieht das so aus:
**%s** \n",**ToUpper(s)**);
**return 0;**
}

Hinweis: Aus für Die Umwandlung in Großbuchstaben gibts in der ctype.h eine Funktion : ‚char toupper(char)‘ dabei ist ja wie bekannt die Großschreibung zu beachten.

Auch hier wieder meine Version

char \*ToUpper(char \*s)
{
 char \*tmp=s;
 while(\*s)
 {
 \*s=toupper(\*s);
 s++;
 }
 return tmp;
}

Und nun zum letzten:

Dieses Programm soll einen Buchstaben durch einen anderen
ersetzen

#include 
char \*Ersetze(char\*s,char c,char d)
{
**als Zähler einen int, nicht einen char**
 int i;

**Du benutzt wieder bloß das erste Zeichen, wie vorhin**
 for(i=0;s[i]!='\0';i++)

**nach der Bedingung schreibst Du, was Du machen   
 willst, wenn sie erfüllt ist, nicht in die Klammer**    
 if(\*s==c: \*s=d) **statt dessen  
 if(s[i]==c) s[i]=d;**  

**das i++ fällt weg, so überspringst Du Zeichen**

**Du hast im Fuktionskopf einen Zeiger auf einen Char  
 als Rückgabewert angegeben, gibst aber den   
 Zählerstand rurück**  
 return i;
**lieber so:  
 return s;**  
} 

**int** main(void)
{
 char s[255];
 printf("Bitte einen String eingeben:");
 gets(s);
**Du willst mit printf nicht das Ergebnis der Funktion   
 ausgeben, gibst sie aber als Parameter an. das ist nicht gut  
 in dem Fall mußt Du die Funktion alleine aufrufen  
  
 Da Du ja einen Zeiger als Parameter übergibst,  
 ist die Zeichenkette aus so geändert   
 Ersetze(s);**   



**printf("Der Buchstabe r wurde durch x  
ersetzt);**  

**return 0;**
}

Auch hier was von mir:

char \*Ersetze(char \*s,char c,char d)
{
 char \*tmp=s;
 while(\*s)
 {
 if(\*s==c)
 \*s=d;
 s++;
 }
 return tmp;
}

Noch ein letztes. Mir ist aufgefallen, daß Du immer

printf(.........., **<u>*</u>** Funktion);

schreibst. Das ‚*‘ gehört nicht zum Funktionsaufruf dazu, sondern zeigt an, das der Rückgabewert ein Zeiger auf etwas ist. Es wird daher beim Aufruf nicht mit angegeben.

Puhh, das war viel. Ich hoffe, ich konnte Dir helfen.

grüße, Micha

Noch ein weiterer Fehler
Hallo,

int i;
for(i=0;s[i]!=’\0’;i++)
if(*s>=‚0‘ && *s=‚0‘ && s[i]