Wie String in Array kriegen?

habe einen string input
in diesen wird etwas eingelesen, danach mit strlen(input) die länge ermittelt und an X zugewiesen

jetzt wollte ich den string zeichen für zeichen in das vorer deklarierte array array[X] einlesen.

Da haperts bei mir. Ich habe über google nur herausgefunden wie man ararys von strings erstellt und ähnliches.

wisst ihr wie ich jetzt den string zeichen für zeichen in das array kriege das aus "döner" etwa

array [0] -> 'd'
array [1] -> 'ö'

usw...

wird?

dankbar für jede hilfe (für kritik weniger :D )
Wolfy
 
Vielleicht liegts an mir, aber ich versteh die Frage nicht so ganz.

Du hast einen Char* - String und möchtest nun die Daten an einen Array weitergeben?

Also an ein char[] Array?

Oder geht es dir um einen C++ String? Den könntest du mit der Funktion:

string.c_str() einfach in ein char[] Array umwandeln.

Naja falls ich total daneben liege erkläre das Prob nochmal genauer (mit Quellcode)

MFG
Ace
 
Ich denke, ich weiß jetzt was du meinst. Und ich gehe mal davon aus, dass du hier von C sprichst.

Also...
Du willst einen beliebig langen String einlesen, diesen dann in ein Char-Array kopieren?

Du könntest es ja mal ungefähr so versuchen:
Code:
char *string;
scanf("%s", string);

Zugreifen könntest du doch dann z. B. mit
Code:
printf("%s", string[0]);

Anders kann ich es mir nicht vorstellen, da du in C die Länge eines Arrays nicht dynamisch festlegen darfst.

[EDIT] Okay, soweit ichs jetzt verstehe, willst dus in C++. Da kann ich dir leider nicht helfen.
 
In C und C++ könnte man den Speicher selbst allokieren, dann kann es prinzipiell beliebig lang sein. In C++ könnte man auch die String Klasse verwenden.

Beispiel für dynamisches Einlesen mit eigener Speicherverwaltung:

Code:
char* read_input(int show_input, char* input_text) {
      char input;
      char* inputArray = NULL;
      int inputLength = 0;
      int Max_Size = DEFAULT_SIZE;
      inputArray = (char*) malloc(sizeof(char) * Max_Size);
      inputArray[0] = '\0';
      if (inputArray == NULL) {
         printf("\nSpeicherfehler, Programm neustarten!\n");
         return NULL;
      }
      printf("\n%s: ", input_text);
      while (1){
         input = getch();
         if (input == 13) {
            printf("\n%");
            return (inputLength?inputArray:NULL);
         /* Zahlen | Grossbuchstaben | Kleinbuchstaben | andere Zeichen*/
         } else if ( (input >= 48 && input <= 57) || 
                     (input >= 65 && input <= 90) ||
                     (input >= 97 && input <= 122) ||
                     (input == 32) || (input == 44) ||
                     (input == 46) ){
            putch(show_input?input:'*');
            ++inputLength;
            if (inputLength >= Max_Size) {
               Max_Size += 5;
               inputArray = (char*) realloc(inputArray, sizeof(char) * Max_Size);
               if (inputArray == NULL) {
                  printf("\nSpeicherfehler, Programm neustarten!\n");
                  }               
            }
            inputArray[inputLength - 1] = input;
            inputArray[inputLength]     = '\0';
         /* Backspace  oder Escape = neue Eingabe */
         } else if (/*input == 8 ||*/ input == 27) {
            free(inputArray);
            printf("\n");
            return read_input(show_input, input_text);
         } else if (input == 8) {
            if (inputLength > 0) {
                printf("\b \b");
                --inputLength;
                inputArray[inputLength] = '\0';
            }
         }
         
      }
      return NULL;
}
 
Original von lookshe
In C und C++ könnte man den Speicher selbst allokieren, dann kann es prinzipiell beliebig lang sein. In C++ könnte man auch die String Klasse verwenden.

In C allerdings nur mit Hilfe von Zeigern, oder? Ein Array muss ja ab der Deklaration eine konstante Länge behalten.
 
Original von Woosh
Original von lookshe
In C und C++ könnte man den Speicher selbst allokieren, dann kann es prinzipiell beliebig lang sein. In C++ könnte man auch die String Klasse verwenden.

In C allerdings nur mit Hilfe von Zeigern, oder? Ein Array muss ja ab der Deklaration eine konstante Länge behalten.

Davon mal abgesehen, dass ein Array nichts anderes ist, als ein Zeiger auf das erste Element, ja.
Beispiel siehst du ja in dem Code von mir.
 
Original von lookshe
Davon mal abgesehen, dass ein Array nichts anderes ist, als ein Zeiger auf das erste Element, ja.
Ja, dass ein Array im Prinzip ein Zeiger ist, weiß ich. Ich sagte ja nur, dass es mit einem Array nicht möglich wäre, da es eine konstante Länge besitzen muss.
 
Wenn du es konstant deklarierst kannst du zwar noch selber was mit dem Zeiger machen, allerdings bleibt dieser anfangs reservierte Speicher im Heap reserviert, wenn ich mich recht entsinne. Da dieser aber beim Start des Programmes fest zugewiesen wird, könntest du das sowieso nicht ändern.

Das Problem ist halt, dass Arrays in C nie konstant sind, da sie nur Zeiger sind. Die Variable selbst für irgendeinen Datentypen, also auch Zeiger, haben eine feste Länge. Worauf die Zeiger allerdings verweisen hat keine feste Länge, nur der ihnen zugewiesene Speicherbereich kann sich unterscheiden, je nachdem wo und wie sie deklariert sind. Sonst hätte man schliesslich nicht die Probleme mit Buffer-Overflows.
 
Bei C++ ist es halt das Problem, das nach dem Speicher der bei Programmstart für den Array belegt wurde, schon neue Variablen oder Anderes kommen.
Das finde ich an Assembler ja so toll. ^^
Dort lege ich mir im Codesegment einfach eine bestimmte Menge Junkcode in dem ich frei arbeiten kann. Man muss nur höllisch aufpassaen wohin man was schiebt und wie groß eine Variable ist...
 
So wie ich das verstanden habe hast du einen C++ String, von dem du das erste Zeichen in die erste Stelle eines Char Arrays einlesen willst, die zweite in die zweite etc.

Das müsste so gehen:

string input;
char array[1000];
int laenge = 5;
input = "Döner";
for(int i = 0; i < laenge; i++)
{
array = input;
}


Das ist jetz keine so schöne Lösung aber sollt eigentlich gehen.
Für laenge muss man einfach die laenge des strings einsetzten, bei array[1000] nehmen wir deshalb so eine große Zahl, weil wir noch nicht wissen, wie lang der String wird, man kann natürlich jede beliebige natürliche Zahl einsetzten, vorausgesetzt, das Array wird nicht zu groß für den Speicher und nicht kleiner als die Länge von input.

Ausgeben kann man das ganze dann mit:

for(int i = 0; i < laenge; i++)
{
cout << array;
}
 
Wie währe es mit...
Code:
string input;
char array[1000];
input = "Döner";
if (input.size()<sizeof(array))
{
for(int i = 0; i < input.size(); i++)
{
array[i] = input[i];
}
}
else
{
cout << "Fehler! String zu lang!" << endl;
}
?
Du solltest dir mal die ganzen Funktionen genauer anschauen. ^^
 
Stimmt ist schöner,
aber man kann das

if(input.size() < sizeof(array))

durch

if(input.size() <= sizeof(array))

ersetzten, das ganze funktioniert ja auch wenn beide gleich groß sind.

Man könnte das ganze eigentlich doch auch mit der #define Direktive machen,
da die Größe des Arrays ja sowieso fix ist

also z.b

#define GROESSE 1000;

und dann weiter:

char array[GROESSE]

und dann

if(input.size() <= GROESSE);

dann erspart man sich die Funktion und hat ne Konstante stattdessen.
Aber eigentlich egal.
 
Kay danke für die antworten!

ERRGÄNZUNGEN: Ist in c++ geschrieben


string.c_str() einfach in ein char[] Array umwandeln.
ich glaube das isses, danke

es ging mir aber nur darum, dass das array die länge des strings hat also:

Code:
char * string;
buffer = strlen(string);
char array [buffer] = string; 
//jetzt das array durch eine schleife zum bearbeiten jagen

in der letzten zeile kam der fehler auf, ich habe keine ahnung wieso.

man kann einen string auch über string[0] ansprechen?
EDIT: geht doch nicht. andere ideen?

das wäre die eleganteste lösung, werde ich gleich mal ausprobieren, also danke für die hilfe
Wolfy
 
Original von Wolfy
Kay danke für die antworten!

ERRGÄNZUNGEN: Ist in c++ geschrieben


string.c_str() einfach in ein char[] Array umwandeln.
ich glaube das isses, danke

es ging mir aber nur darum, dass das array die länge des strings hat also:

Code:
char * string;
buffer = strlen(string);
char array [buffer] = string; 
//jetzt das array durch eine schleife zum bearbeiten jagen

in der letzten zeile kam der fehler auf, ich habe keine ahnung wieso.

man kann einen string auch über string[0] ansprechen?
das wäre die eleganteste lösung, werde ich gleich mal ausprobieren, also danke für die hilfe
Wolfy

der Fehler ist logisch, da ein array in c++ bei der initialisierung eine konstante größe erwartet. das heißt , dass schon vorm kompilieren klar sein muss, wie groß das array ist. also ist nur sowas möglich:
Code:
char meinTollesArray[128];
 
kay dann ist das der fehler... aber dann wäre es ja unmöglich das array so groß wie den string zu machen :(
Dann wäre es meine letzte hoffnung den string über den index anzusprechen. geht das?
Oder muss ich c_string() doch anwenden? ?(
 
Damit da einmal ein bisschen Licht in die Finsternis kommt, hab ich euch ein bisschen Beispielcode gebastelt. Ihr solltet euch aber echt mal mit den Grundlagen der C/C++ Entwicklung beschäftigen, weil man das mit den Zeigern, Strings und Speicher doch gut verstehen sollte.

Code:
#include <cstdlib>
#include <iostream>
#include <string>

using namespace std;

int main(int argc, char *argv[])
{
    string str = "Hello World";
    char *cstr = new char[str.size()+1]; // dynamisch Speicher laden
    strcpy(cstr,str.c_str());
    
    cout<<cstr<<endl;
    cout<<str[0]<<endl; // der STL-String lässt sich auch über Index ansprechen !!!
    
    delete []cstr; // Speicher freigeben !!!
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
 
Es wurden doch jede Menge Tipps gegeben: Alloziere das Array einfach! Ob mit malloc oder mit new ist Wurst. Was ist daran kompliziert?
 
Zurück
Oben