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! ^^


Anmelden zum Antworten