save char array content into variable

Programmiersprache: C

ja stimmt, im moment stehe ich an. danke trotzdem.
ich probier aber nochmal eine zusammenfassung der gesamten programm situation zu beschreiben,
vielleicht hat ja jemand einen ansatz, da der ja nicht geht.

aufgabenstellung:

programm array mit einem zeichen pro position im main.
dieses wird als zeiger an eine funktion "aendern" übergeben. (globale variablen sind nicht erlaubt)

diese funktion "ändern" soll nun an der eingegebenen position den bestehenden inhalt auf den eingegeben ändern.
eingabe: -> aendern 2 aab
also an array position 2 den inhalt "aab".
funktion abgeschlossen.

wenn man dann innerhalb einer anderen funktion, außerhalb von main oder auch im main, ein print von position 2 macht, soll "aab" ausgegeben werden.

anbei ein code beispiel für die änderung eines zeichens.
ich ändere hier, hardcodet die position 0 von t auf n in der funktion "ändern"
und gebe die änderung an das eigentliche array zurück und lese es in der funktion "schauen" aus.

nur soll anstelle von "n" hier eben "aab" stehen, und bei printf prog 0 auch aab ausgegeben werden;
(das letzte strcpy funktioniert nicht, nicht wundern; aber zum veranschaulichen reichts denke ich)

Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int aendern(char**);
int schauen(char**);

int main(){
  char *strings = "test";
  printf ("main vorher: %s\n", strings);
  printf ("main vorher pos 0: %c\n", strings[0]);
  aendern(&strings);
  printf ("main nachher: %s\n", strings);
  printf ("main nachher pos 0: %c\n", strings[0]);
  schauen(&strings);
  return 0;
}

int aendern(char** strings){
  printf ("aendern vorher: %s\n", *strings);
  printf ("aendern vorher pos 0: %c\n", *strings[0]);
  char program[strlen(*strings)];
  strcpy(program, *strings);
  program[0] = 'n';
  printf ("aendern nachher: %s\n", program);
  printf ("aendern nachher pos 0: %c\n", program[0]);
  strcpy(*strings, program);
  return 0;
}

int schauen(char** strings){
  char program[strlen(*strings)];
  strcpy(program, *strings);
  printf ("schauen pos 0: %c\n", program[0]);
  return 0;
}
 
Zuletzt bearbeitet:
Sorry, steige hiermit aus.
Es wird kein bisschen klarer, deine Beschreibung passt nicht zum
Code, und ist außerdem ziemlich unlesbar (angefangen mit
Netiquette 15 ist da einiger Verbesserbungsbedarf).

Was wirklich helfen würde ist deine Aufgabe im Original,
nicht deine Interpretation davon, und der unveränderte originale Code.

Unabhängig davon hast du mehrere Fehler im gezeigten Code, zB.
Code:
char program[strlen(*strings)]; //VLA
Code:
char *strings = "test"; //Konstante
 
Zuletzt bearbeitet:
korrigiert, angepaßt, und kompiliert fehlerfrei.
code struktur ist netbeans standard.

mit nur einem zeichen, also ändern von T auf n funktioniert.
ich möchte aber der position 0 wo das T steht zu beginn, eine änderung auf "nnn" durchführen.
so dass wenn ich die funktion "schauen" aufrufe und ein print der position 0 mache, auch "nnn" da steht.


Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int aendern(char*);
int schauen(char*);

int main(){

  char strings[] = {'T','e','s','t'};

  printf ("main vorher: %s\n", strings);
  printf ("main vorher pos 0: %c\n", strings[0]);
  printf ("--------------------------------\n");

  aendern(strings);

  printf ("main nachher: %s\n", strings);
  printf ("main nachher pos 0: %c\n", strings[0]);
  printf ("--------------------------------\n");

  schauen(strings);

  return 0;
}

int aendern(char* strings){

  printf ("aendern vorher: %s\n", strings);
  printf ("aendern vorher pos 0: %c\n", strings[0]);
  printf ("\n");

  char program[strlen(strings)];
  strcpy(program, strings);

  program[0] = 'n';

  printf ("aendern nachher: %s\n", program);
  printf ("aendern nachher pos 0: %c\n", program[0]);
  printf ("--------------------------------\n");

  strcpy(strings, program);

  return 0;

}

int schauen(char* strings){

  char program[strlen(strings)];
  strcpy(program, strings);

  printf ("schauen pos 0: %c\n", program[0]);
  printf ("--------------------------------\n");

  return 0;
}
 
Sorry, steige hiermit aus.
Und ich ein :)
diese funktion "ändern" soll nun an der eingegebenen position den bestehenden inhalt auf den eingegeben ändern.
eingabe: -> aendern 2 aab
also an array position 2 den inhalt "aab".
funktion abgeschlossen.

Ich mache mal einen Durchgang:

Starten wir mit char* string = "Test" bzw. char string[] = 'T','e','s','t','\0'.
Die 2. Position in string ist somit 'e'. Das ist ein Zeichen bzw. in diesem Fall auch ein Byte. An diese Stelle kannst du in der der "char* string"-Variante nichts schreiben (char* string ="bla" ist konstant, nicht änderbar), in der char string[]-Variante kannst du anstelle des 'e' ein anderes Zeichen schreiben, aber den Array/string nicht vergrössern. Also: Ein Zeichen ändern: Kein Problem. Grösse des Strings ändern: Wie schon oft gesagt: Unmöglich. Wirklich.

Zu deinem 2. Post:

mit nur einem zeichen, also ändern von T auf n funktioniert.
ich möchte aber der position 0 wo das T steht zu beginn, eine änderung auf "nnn" durchführen.
so dass wenn ich die funktion "schauen" aufrufe und ein print der position 0 mache, auch "nnn" da steht.
Wiederum wird dir das
C++:
char strings[] = {'T','e','s','t'};
um die Ohren fliegen. Du musst eine 0 anfügen. Wie sonst soll der Computer wissen, wann der String zu Ende ist?
C++:
char strings[] = {'T','e','s','t', '\0'};
Nun zum Einfügen: Es geht. Aber mit einer völlig anderen Codestruktur.

C++:
char* string = (char*)calloc(strlen("Test") + 1, sizeof(char));
if(string == NULL)
{
    return -1;
}
strcpy(string, "Test"); //string auf "Test" setzen

//Einfügen des strings "ins" an Position n:
char* tmp = (char*)calloc(strlen(string) - n, sizeof(char));
//auf NULL testen...
strcpy(tmp, string + n); //Den string nach der Position n zwischenspeichern
char* nstr = (char*)realloc(string, strlen(ins) + strlen(string) + 1);
//Null prüfen
string = nstr;
strcpy(string + n, ins);
strcpy(string + n + strlen(ins), tmp);
free(tmp);

//Lesen von k Zeichen an Position n
for(size_t i = 0; i < k; i++) putc(string[n+i]);

So. Nun meinst du vermutlich was anderes, nämlich, dass du mehrere Strings in einem Array haben willst.
Das wäre ähnlich wie oben, allerdings mit char**. Das würde aber noch komplizierteren Code als oben genannt zur Folge haben.
Falls es dich interessiert, kannst du dann ja nachfragen.

Gruss
cwriter
 
Zuletzt bearbeitet von einem Moderator:
...und kompiliert fehlerfrei.
Das bedeutet gar nichts. Der Compiler erkennt keine logischen Fehler, sondern prinzipiell nur technische.

char program[strlen(strings)];
Das reserviert 1 Byte zu wenig.

ich möchte aber der position 0 wo das T steht zu beginn, eine änderung auf "nnn" durchführen.
Du kannst an eine Speicherstelle mit Platz für 1 char nicht 3 char eintragen. Du musst den String verlängern (um 2 char) und dann z.B. mit sprintf weitermachen:
C++:
char *neustring = malloc( strlen(altstring) + 1 + 2 );
sprintf(neustring,"%s%s","nnn",altstring+1);
...
free(neustring);
 
Zurück