Zeichen in String einfügen



  • Hi,

    Ich bin ganz neu in C und würde bei einer kurzen Funktion Hilfe benötigen.
    Das Ziel davon wäre in einen String (zum Beispiel "Hochhaus") vor jeden Buchstaben ein Zeichen (zum Beispiel "k") einzufügen.

    Wäre sehr dankbar über Hilfestellungen und Denkanstöße.

    Lg



  • Soll das im gleichen Speicherbereich (String sein) oder kann das auch in einen neuen kopiert werden?

    Zeig deinen Ansatz den du hast, dann können wir dir auch Hinweise geben, wo es hakt.

    Wenn du nicht weisst wie du anfangen sollst, dann nimm einen Zettel und einen Stift und mal es dir auf.
    Beobachte dich dabei, wie du das machst.
    Mit Scrabble-Steinen sollte es etwas besser gehen 😉



  • Es soll quasi ein neuer damit erstellt werden.
    Also prinzipiell sollen eben, wie als Beispiel "Hochaus" und "k" genannt, erst in der main_Funktion bestimmt werden und die Funktion um den String zu allgemein sein.

    Also Code hab ich bisher noch keinen zusammen gebracht weil ich vom Denkansatz schon nicht sicher bin wie es umzusetzen geht. Und zwar hab ich zuerst mal vor die Länge des gegeben Strings zu ermitteln. Dann mit einer for-Schleife zeichenweise den String durchzugehen bis "\0". Und dann kommt schon mein Problem, wie schaffe ich es eben vor jedem Zeichen ein neues einzufügen das "kHkokckhkhkakuks" ergibt?



  • Fang mal mit einer Funktion an, die erstmal dasselbe macht wie strcpy .
    Dann hast du schon mal die halbe Miete.

    Den Speicher für den neuen String machst du erstmal ausreichend (z.B 2000 Zeichen) groß.



  • Ich kann jetzt zwar nicht sagen ob das so richtig ist, aber das wär mal mein bisheriger Fortschritt

    int calculateLength(char* text)
    {
      int i;
      for(i = 0; text[i] != '\0'; i++);
      return i;
    }
    
    char* insertChar(char* text, char chr)
    {
      int i;
      int j = 0;
      int length;
      char* return_text = NULL;
    
      length = calculateLength(text);
    
      return_text = (char*)malloc(length * sizeof(char) + 1);
      if(return_text != NULL)
      {
        for(i = 0; text[i] != '\0'; i++)
        {
    	  if(text[i] != '\0')
    	  {
    	    return_text[j++] = text[i];
    	  }
        }
    
    	return_text[j] = '\0';
        return return_text;
      }
    
      return NULL;
    }
    


  • Das malloc in so einer Funktion ist kein guter Stil.
    Übergib ein ausreichen großen Speicherbereich an diese Funktion. (Den kannst du mit malloc besorgen)

    Zeile 23 ist überflüssig, denn der Fall kann an der Stelle nie eintreten, da er schon vom for abgefangen wird.

    Jetzt die entscheidende Frage:
    Wie sieht die Zeile aus, die chr einbaut und wo kommt die hin?

    Ja klar, in die Schleife.
    Und vor Zeile 25, da ja chr vor dem ersten Zeichen von text kommt.



  • Sollte dann so passen oder vertu ich mich da jetzt richtig?

    if(return_text != NULL)
      {
        for(i = 0; text[i] != '\0'; i++)
        {
    	  chr + text[i];
    	  return_text[j++] = text[i];
        }
    
    	return_text[j] = '\0';
        return return_text;
      }
    
      return NULL;
    }
    


  • Was macht Zeile 5?



  • noro_lim_asfaloth schrieb:

    Sollte dann so passen oder vertu ich mich da jetzt richtig?

    Ja, so richtig mächtig.

    Du willst etwas in return_text schreiben. Also musst du auch diese Variable angeben.
    Da das ein Array ist, brauchst du noch eine Indexvariable.
    Du willst etwas zuweisen, daher brauchst du ein =
    Du möchtest den Inhalt von chr darein schreiben. Also musst du auch chr angeben.
    Und du möchtest, das dieser Wert in return_text nicht überschrieben wird, daher musst du den Index weiterzählen.



  • Hab jetzt mal versucht ganz zu machen, bin mir aber wieder nicht sicher ob es jetzt passt.
    Und außerdem zeigts mir beim compiler "variable sized object may not be initialized" an.

    #include<stdio.h>
    #include <stdlib.h>
    
    int calculateLength(char* text)
    {
      int i;
      for(i = 0; text[i] != '\0'; i++);
      return i;
    }
    
    char* insertCharacter(char* text, char chr)
    {
      int i;
      int j = 0;
      int length;
      char* return_text = NULL;
    
      length = calculateLength(text);
    
      return_text = (char*)malloc(length * sizeof(char) + 1);
      if(return_text != NULL)
      {
        for(i = 0; text[i] != '\0'; i++)
        {
    	  return_text[j] = chr + text[i];
    	  j++;
    	  return_text[j++] = text[i];
        }
    
    	return_text[j] = '\0';
        return return_text;
      }
    
      return NULL;
    }
    
    int main()
    {
      char i;
      char chr = 'k';
      char text[i] = "Hochhaus";
    
      printf("%s\n", insertCharacter(text, chr));
    
      return 0;
    
    }
    


  • das malloc hab ich noch vergessen umzuschreiben



  • noro_lim_asfaloth schrieb:

    Und außerdem zeigts mir beim compiler "variable sized object may not be initialized" an.

    Dann wird irgendetwas falsch sein.
    Der Compiler ist allerdings so nett und sagt dir auch, wo genau dieser Fehler ist.
    Und es wäre noch besser, uns zu sagen wo dieser Fehler ist.

    Er ist in Zeile 42 (Und hier ist die Antwort kein blöder Spruch)

    Was soll diese Zeile. Bedenke dabei, das es ein Definition ist. Was macht das i und welchen Wert hast es dort.
    Ist es dort überhaupt nötig?


Anmelden zum Antworten