# Pointer und Schleife



## Java The Hutt (14. Feb 2019)

Hallo,

weitere folgende Aufgabe:

"Vervollständigen Sie die folgende Funktion abc, die eine Zeichenkette übergeben bekommt und eine Zeichenkette bereitstellt, in der Jedes "A" und "a" durch einen Bindestrich (-) ersetzt wird. Verwenden Sie dazu außschließlich den Zeiger pt (keine anderen Variablen)! Formulieren Sie eine Anweisung im Hauptprogramm, die die Funktion abc(char *txt*) aufuft.


```
abc(char *txt){
char *pt;
for ( ptr = .....; .......; pt++)
....
```

Mein Lösungsansatz:
(Ist die Aufgabe damit vollständig abgeschlossen oder gibt es einen einfachere, schnellere Möglichkeit? 

```
#include <stdio.h>
#include <conio.h>

char abc(char txt [50])

{

    int i;
    int *ptr;
    ptr = &i;
    for (*ptr = 0; *ptr < 50; (*ptr)++){
            if (txt [*ptr] == 'A'){
        printf("-");
            }else if (txt [*ptr] == 'a'){
               printf("-");
            }else{
        printf("%c", txt[*ptr]);
            }
    }
    return *txt;
}

int main(void)
{


    char txt [50] = {'A','B','a','b','A', 'c' ,'\0'};

    printf("Die Originale Zeichenkette lautet: \t%s\n", txt);
    printf("Nach Umwandlung erhält man:\t\t");
    abc(txt);




    return 0;
}
```


----------



## mihe7 (14. Feb 2019)

Java The Hutt hat gesagt.:


> Ist die Aufgabe damit vollständig abgeschlossen oder gibt es einen einfachere, schnellere Möglichkeit?


Die Aufgabe ist noch nicht einmal gelöst: "Verwenden Sie dazu außschließlich den Zeiger pt (keine anderen Variablen)!" Der Anfang Deiner Funktion kann exakt so aussehen, wie in dem angegebenen Beispiel. Zum zweiten Teil Deiner Frage: ja, gibt es.


----------



## Java The Hutt (14. Feb 2019)

Ich habe das ganze mit jetztigem Wissen von der vorherigen Aufgabe überarbeitet. 

Dabei 2 Fragen, ich weiß, dass es geht, dass man 
	
	
	
	





```
if (*pt == 'A')
```
 hier noch eine weitere Bedingung hinzufügt, mit && nimmt er diese leider nicht an. 
Wie kann das Problem beheben und den Code verbessern?



Spoiler: Code





```
#include <stdio.h>
#include <conio.h>

char abc(char *txt)
{
    char *pt;
    for ( pt = txt; *pt != 0; pt++)
    {
        if (*pt == 'A')
        {
            printf("-");
        }
        else if (*pt == 'a'){
            printf("-");
        }
        else
        {
            printf("%c", *pt);
        }

    };printf("\n");
}

int main()
{
    char zeichenkette [] = "HAlla\0";

    abc(zeichenkette);


    char eingabe [25];
    printf("Bitte Text eingeben: \t");
    gets(eingabe);
    abc(eingabe);
}
```


----------



## mihe7 (14. Feb 2019)

Java The Hutt hat gesagt.:


> hier noch eine weitere Bedingung hinzufügt, mit && nimmt er diese leider nicht an.


Du suchst:

```
if (*pt == 'A' || *pt == 'a')
```
Nun noch ein wenig Verwirrung stiften :

```
char *abc(char *txt)
{
    char *pt;
    for ( pt = txt; *pt != 0; pt++) {
        if ((*pt & 0xDF) == 0x41)
            *pt = '-';
    }
    return txt;
}
```


----------



## Java The Hutt (15. Feb 2019)

mihe7 hat gesagt.:


> Du suchst:
> 
> ```
> if (*pt == 'A' || *pt == 'a')
> ...




Genau das suchte ich! Danke dir!
Ich habe noch 2 weitere Aufgaben, jedoch schon Lösungsansätze, wobei ich aber noch 2 Fragen habe.
Die eine zuerst:
Ein Programm enthält folgende Struktur:
(Man soll der Breite den Wert 100 zuweisen, über die Variable fernseher als auch über pt.


Spoiler: Sruktur





```
struct fern
{
    char firma[20];
    char modell[25];
    int preis;
    struct gr
    {
        short breite;
        short hoehe;
        short tiefe;
    } groesse;
};
```




Des weiteren sind folgende Variablen definiert:

```
struct fern fernseher, *pt=&fernseher;
```

Ich habe eine Frage bezüglich *pt=&fernseher.
*pt dereferenziert ja die Speicheradresse zu einem Wert.
Also fügt man doch an der Stelle, einen Wert = der Speicheradresse des Fernsehers.?
Ich habe es in meiner Lösung auch mal durchgetestet, da gibts natürlich Probleme, aber woran liegt das, dass es genau so gemacht wird?




Spoiler: Lösung:





```
fernseher.groesse.breite = 120;
    printf("Der Fernseher hat die Breite %d cm\n", fernseher.groesse.breite);
    pt->groesse.breite = 100;
    printf("Der Fernseher hat die Breite %d cm", fernseher.groesse.breite);
```


----------



## mihe7 (15. Feb 2019)

Java The Hutt hat gesagt.:


> *pt dereferenziert ja die Speicheradresse zu einem Wert.


Hier geht es um eine Deklaration. pt wird als Zeiger auf eine Struktur fern deklariert, dieser wird mit der Adresse von fernseher initialisiert. Ausgeschrieben:

```
struct fern fernseher;
struct fern *pt;
pt=&fernseher;
```



Java The Hutt hat gesagt.:


> woran liegt das, dass es genau so gemacht wird?


Warum man noch einen Zeiger deklariert, oder was meinst Du?


----------



## Java The Hutt (17. Feb 2019)

Eine Frage noch bezüglich Endkennung. Ist es besser *ptr != ´Backslash 0´zu schreiben oder *ptr != 0


----------



## mihe7 (18. Feb 2019)

Richtiger wäre mMn tatsächlich '\0', da das ein char-Literal ist und somit char mit char verglichen wird.


----------

