Anfängerfrage mit Zeiger
-
DANKE!!!
Noch eine Anmerkung: Wenn ich die Fkt mit father.setName("Karl") aufrufe, ist dann die 0te Stelle ein " ?? Oder wann oder warum brauch ich diese Anführungszeichen?Stell mich vielleicht etwas. Ich habe Microsoft Visual Studio 2005 und bei mir läuft folgendes Programm nicht. Woran liegt das bzw. was muss ich ändern. mit .Net hat es funktioniert.
#include <iostream>
#include <cstring>
using namespace std;#define MAXNAMELENGTH 64
class Person
{
char name[MAXNAMELENGTH + 1];
int age;
public:
void setName(const char *pNam);
void setAge(int ag);
void print(FILE *pf) const;
int scan(FILE *pf);
};void Person::setName(const char *pNam)
{
strcpy(name, pNam);
}void Person::setAge(int ag)
{
age = ag;
}void Person::print(FILE *pf) const
{
fprintf(pf, "%s %d\n", name, age);
}int Person::scan(FILE *pf)
{
return fscanf(pf, "%s%d", name, &age); // age ohne Fehlerabfrage!
}int main(void)
{
Person father, mother, myself;father.setName("Karl");
father.setAge(55);
mother.setName("Brigitte");
mother.setAge(51);printf("Bitte Vorname und Alter (durch Leerzeichen getrennt) eingeben: ");
myself.scan(stdin);Person son;
son = myself;
son.setAge(2);father.print(stdout);
mother.print(stdout);
myself.print(stdout);
son.print(stdout);return 0;
}
-
Helene schrieb:
DANKE!!!
Noch eine Anmerkung: Wenn ich die Fkt mit father.setName("Karl") aufrufe, ist dann die 0te Stelle ein " ?? Oder wann oder warum brauch ich diese Anführungszeichen?[/cpp]
Die Anführungszeichen sagen dem Compiler, das nun kein Variablenname kommt sondern, ein Konstanter String. Wenn du sie weglassen würdest, würde der Compiler eine Variable namens Karl suchen (die er wahrscheinlich nicht findet). Die 0te stelle ist als K und die fünfte ist '\0'.[cpp]Stell mich vielleicht etwas. Ich habe Microsoft Visual Studio 2005 und bei mir läuft folgendes Programm nicht. Woran liegt das bzw. was muss ich ändern. mit .Net hat es funktioniert.
#include <iostream>
#include <cstring>
using namespace std;#define MAXNAMELENGTH 64
class Person
{
char name[MAXNAMELENGTH + 1];
int age;
public:
void setName(const char *pNam);
void setAge(int ag);
void print(FILE *pf) const;
int scan(FILE *pf);
};void Person::setName(const char *pNam)
{
strcpy(name, pNam);
}void Person::setAge(int ag)
{
age = ag;
}void Person::print(FILE *pf) const
{
fprintf(pf, "%s %d\n", name, age);
}int Person::scan(FILE *pf)
{
return fscanf(pf, "%s%d", name, &age); // age ohne Fehlerabfrage!
}int main(void)
{
Person father, mother, myself;father.setName("Karl");
father.setAge(55);
mother.setName("Brigitte");
mother.setAge(51);printf("Bitte Vorname und Alter (durch Leerzeichen getrennt) eingeben: ");
myself.scan(stdin);Person son;
son = myself;
son.setAge(2);father.print(stdout);
mother.print(stdout);
myself.print(stdout);
son.print(stdout);return 0;
}Fehlermeldung?
-
1>------ Erstellen gestartet: Projekt: Person, Konfiguration: Debug Win32 ------
1>Kompilieren...
1>person.cpp
1>d:\studium_2006\me5_informatik_2b_jesorsky\visual_projekte\person\person\person.cpp(19) : warning C4996: 'strcpy' wurde als veraltet deklariert
1> c:\programme\microsoft visual studio 8\vc\include\string.h(73): Siehe Deklaration von 'strcpy'
1> Meldung: "This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details."
1>d:\studium_2006\me5_informatik_2b_jesorsky\visual_projekte\person\person\person.cpp(34) : warning C4996: 'fscanf' wurde als veraltet deklariert
1> c:\programme\microsoft visual studio 8\vc\include\stdio.h(249): Siehe Deklaration von 'fscanf'
1> Meldung: "This function or variable may be unsafe. Consider using fscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details."
1>Das Buildprotokoll wurde unter "file://d:\STUDIUM_2006\ME5_INFORMATIK_2b_Jesorsky\Visual_Projekte\Person\Person\Debug\BuildLog.htm" gespeichert.
1>Person - 0 Fehler, 2 Warnung(en)
========== Erstellen: 1 erfolgreich, Fehler bei 0, 0 aktuell, 0 übersprungen ==========
-
Noch eine Frage zur folgenden Funktion:
char *strcpy( char *dest, const char *src )
{
char *tmp = dest;
while( (*dest++ = *src++) != '\0' ); // hier wird mittels Zeiger-Arithmetik der Inhalt kopiert
return tmp;
}geht es nicht auch so:
char *strcpy( char *dest, const char *src )
{
while( (*dest++ = *src++) != '\0' );
return dest;
}Für was brauch ich dieses tmp?
-
strcpy ist so definiert dass dest zurückgegeben wird. Da Du dest ja veränderst musst Du es irgendwo sichern. Dafür ist tmp.
Die Funktion die Du implementiert hast gibt es übrigens tatsächlich, und zwar als GNU-Erweiterung (natürlich dann nur mit GCC) und heisst stpcpy - sie liefert einen Zeiger auf das Ende von dest zurück

-
Erstellen: 1 erfolgreich
Also gar kein Fehler? Was klappt denn nicht??
So ist es vielleicht klarer wozu du tmp brauchst:
char *strcpy( char *dest, const char *src ) { char *tmp = dest; while( (*tmp++ = *src++) != '\0' ); // hier wird mittels Zeiger-Arithmetik der Inhalt kopiert return dest; }
-
Helene schrieb:
Noch eine Frage zur folgenden Funktion:
char *strcpy( char *dest, const char *src )
{
char *tmp = dest;
while( (*dest++ = *src++) != '\0' ); // hier wird mittels Zeiger-Arithmetik der Inhalt kopiert
return tmp;
}geht es nicht auch so:
char *strcpy( char *dest, const char *src )
{
while( (*dest++ = *src++) != '\0' );
return dest;
}Für was brauch ich dieses tmp?
Ich glaube das geht nicht, allerdings bin ich noch ein totaler anfänger.
tmp speichtert doch den Wert von dest vor der Whileschleife und gibt diesen zurück, bei dest wäre das ja der Wert nach der Schleife, ausserdem ist dest ein zeiger, das wird doch automatisch im hauptprogramm übernommen.
Bitte erschlagt mich nicht wen ich unsinn rede

-
In temp speicherst Du die Anfangsadresse von dest (ziel), dest wird beim Kopieren laufend erhöht.
Ist nun klar wozu temp gebraucht wird?
-
das mit dem tmp zeiger habe ich verstanden.
(*dest++ = *src++) != '\0' )
wird das von der reihenfolge her so abgearbeitet?
1)*dest = *src;
2)*src != '\0'
3)scr++,dest++
usw
-
Noch ne Frage:
Zeigt der This-Zeiger bei dieser Fkt:
void Person::print(FILE *pf) const
{
fprintf(pf, "%s %d\n", name, age);
}auf name, oder wie kann man das einfach erklären?
-
Helene schrieb:
das mit dem tmp zeiger habe ich verstanden.
(*dest++ = *src++) != '\0' )
wird das von der reihenfolge her so abgearbeitet?
1)*dest = *src;
2)*src != '\0'
3)scr++,dest++
uswUngefähr so:
- temp1 = dest
- dest += 1
- temp2 = src
- src += 1
- *temp1 = *temp2
- Wenn *temp1 == '\0' -> verlassen sonst -> Punkt 1.
mfg.