Inhalt eines char Pointers konvertieren
-
das kann doch garnicht sein sonst würde ja das hier
PtrNamPtrArr[i][strlen(PtrNamPtrArr[i])-1] = '\0';
auch nicht klappen?
-
Innerhalb der Funktion GetNamen() kann ich auch alles per printf() ausgeben.
Zurück in Main() oder in der Ausgabe-Funktion OutNamen() allerdings wiederum nicht. Ich schätze, dass irgendwie das Array falsch übermittelt wird, oder falsch abgespeichert oder sonstwas. Ich hab wirklich keine Ahnung.
void OutNamen(char *KopfText, char *NamPtrArr[], int NamAnz) { char dummy[81]; //clrscr(); printf ("%s\n\n", KopfText); for (int i = 0; i < NamAnz; i++) { printf("Name %2d: %s\n", i+1, NamPtrArr[i]); } printf("\nweiter mit [return]:"); gets(dummy); }
void GetNamen(char *NamPtrArr[], int NamAnz) { int nameLength = MAXANZ; int arrayLength = NamAnz; int i; char *buffer;//könnte man auch weglassen da es sich nicht ändert //malloc castet man nur in c++ da bist aber im falschen unter forum;) //wir holen uns den gesamten speicher für die strings und das array NamPtrArr = (char**) malloc((sizeof(char*)*arrayLength)+(sizeof(char)*arrayLength*nameLength)); if(NamPtrArr != NULL){ buffer = (char*)(NamPtrArr+sizeof(char*) * arrayLength); //buffer zeigt jetzt auf den ersten wert nach dem array //jetzt weisem wir dem array den speicher für die strings zu for(i = 0; i < arrayLength; i++){ NamPtrArr[i] = (buffer + i * (sizeof(char) * nameLength)); } for(i = 0; i < arrayLength; i++){ printf("Name %2d: ", i+1); fgets(NamPtrArr[i],nameLength,stdin); //fgets nimmt '\n' mit das machen wir wieder weg... NamPtrArr[i][strlen(NamPtrArr[i])-1] = '\0'; } for(i = 0; i < arrayLength; i++){ printf("%d", i); printf(NamPtrArr[i]); } } printf("\n\nweiter mit [return]:"); }
int main(void) { char **PtrNamPtrArr = NULL; int NamAnz = 0; //char *TstNamPtrArr[10] = { "hans", "FRANZ", "oTTo", "lisa-marie", "LISA MARIE" }; //int NamAnz = 5; printf("Anzahl der Namen: "); scanf("%d", &NamAnz); getchar(); printf("\n\n"); GetNamen(PtrNamPtrArr, NamAnz); OutNamen("Ausgabe 1: Namen in Original-Reihenfolge und Original-Schreibweise", PtrNamPtrArr, NamAnz); ConvertNamen(PtrNamPtrArr, NamAnz); OutNamen("Ausgabe 2: Namen in Original-Reihenfolge mit korrigierter Schreibweise", PtrNamPtrArr, NamAnz); SortNamen(PtrNamPtrArr, NamAnz); OutNamen("Ausgabe 3: Namen alphabetisch aufsteigend sortiert", PtrNamPtrArr, NamAnz); }
-
versuch mal sowas
char **GetNamen(char *NamPtrArr[], int NamAnz) { statt void GetNamen(char *NamPtrArr[], int NamAnz) { natürlich am ende der GetNamen funktion return NamPtrArr; und PtrNamPtrArr = GetNamen(PtrNamPtrArr, NamAnz); statt GetNamen(PtrNamPtrArr, NamAnz);
-
btw. hab mal gehört, sowas
scanf("%d", &NamAnz); getchar(); printf("\n\n");
macht man nur wenn man was zu verstecken hat
und solltest du nach sloc bezahlt werden schießt dir selbst ins bein...
-
sollte mein vorheriger post klappen kannst auch
char **GetNamen(int NamAnz) { char *NamPtrArr[] ..... statt char **GetNamen(char *NamPtrArr[], int NamAnz) { .....
machen
-
So funktioniert jetzt alles. Nur leider sind die Unterprogrammköpfe ebenfalls in der Aufgabenstellung vorgegeben. Das heißt die müssen void sein.
-
Kuh-Couch schrieb:
Nur leider sind die Unterprogrammköpfe ebenfalls in der Aufgabenstellung vorgegeben.
ich hab schon gewußt wieso ich solche zettel nicht leiden konnte
dann mach alles bis auf
for(i = 0; i < arrayLength; i++){ printf("Name %2d: ", i+1); fgets(NamPtrArr[i],nameLength,stdin); //fgets nimmt '\n' mit das machen wir wieder weg... NamPtrArr[i][strlen(NamPtrArr[i])-1] = '\0'; }
aus der function raus und packs in main() oder eine eigene function createArray() oder so wenn das erlaubt ist, sonst machst ihm ne monster main
jeder wie er es haben will...
das problem ist dass du der function einen NULL pointer übergibst und dieser dann mit speicher gefüllt wird, wird die function beendet steht da wieder NULL drin d.h. du mußt der function einen pointer != NULL übergeben
-
Die Main dürfen wir zuklatschen wie wir wollen, MIT DER AUSNAHME, dass wir außer PtrNamPtrArr und NamAnz keine Variablen zu Programmstart definiert haben dürfen. Das heißt wenn du jetzt auch noch eine Methode hast, wie wir das ganze ohne
char *buffer;
in der Main lösen können, wäre uns super geholfen.
-
buffer = (char*)(NamPtrArr+sizeof(char*) * arrayLength); //buffer zeigt jetzt auf den ersten wert nach dem array //jetzt weisem wir dem array den speicher für die strings zu for(i = 0; i < arrayLength; i++){ NamPtrArr[i] = (buffer + i * (sizeof(char) * nameLength)); }
na dann
for(i = 0; i < arrayLength; i++){ NamPtrArr[i] = ((NamPtrArr+sizeof(char*) * arrayLength) + i * (sizeof(char) * nameLength)); }
evtl. muß da noch der ein oder andere cast rein evtl. so??
for(i = 0; i < arrayLength; i++){ NamPtrArr[i] = (((char*)(NamPtrArr+sizeof(char*) * arrayLength)) + i * (sizeof(char) * nameLength)); }
na dann mal viel spaß damit
-
Okay vielen Dank, jetzt klappt alles! ^^