hallo, ich habe ein Programm für ein Wartezimmer, die Funktion um neue Personen aufzunehmen findet ihr im Bild. Ich lege einen neuen Pointer (neu) an und reserviere Speicher für die nächste Struktur. Dann gebe ich die Infos ein und will diese mit neu->... abspeichern. Allerdings gibt es hier Probleme! Bei neu-> age funktioniert das noch, aber bei den anderen beiden kommt die Fehlermeldung, dass der Ausdruck ein änderbarer ivalue sein muss. Hoffe ihr könnt mir sagen, was ich ändern muss
Fragant schrieb: > ich habe ein Programm für ein Wartezimmer, die Funktion um neue Personen > aufzunehmen findet ihr im Bild. das ist schon das Problem. Compiler und auch wir können keine Bilder parsen und den Inhalt verstehen.
https://www.mikrocontroller.net/articles/String-Verarbeitung_in_C >Arrays sind in C keine vollwertigen Datentypen, z. B. ist es nicht >möglich, einem Array in einem Rutsch ein anderes Array zuzuweisen oder 2 >Arrays miteinander zu vergleichen. Genau das möchte man aber in der >Stringverarbeitung häufig.
Fragant schrieb: > Hoffe ihr könnt mir sagen, was ich ändern muss Strings kann man in C nicht zuweisen, dafür gibt es Funktionen wie strcmp.
Ja, heilig's Blechle! Wie doch immer wieder einer auf die Idee kommt, Programm/texte/ als JPG zu posten? Ach, ich habs, das sind die ohne C-Buch. Klar. Stirnklatzsch. Mach Deine Sch... hausaufgaben alleine.
Peter II schrieb: > Strings kann man in C nicht zuweisen, dafür gibt es Funktionen wie > strcmp. du meinst strcpy?
Peter II schrieb: > Compiler und auch wir können keine Bilder > parsen und den Inhalt verstehen. Also ich kann Text in Bildern schon "parsen". Wobei die Verwendung von JPG hier total ungeangebracht ist. Peter II schrieb: > Strings kann man in C nicht zuweisen, dafür gibt es Funktionen wie > strcmp. Ich denke du meinst strcpy. Mit strcmp kann man nichts kopieren oder zuweisen.
-------------------------------------------------------
1 | struct patient{ |
2 | char name[20]; |
3 | char illness[30]; |
4 | int age; |
5 | struct patient *next; |
6 | };
|
7 | |
8 | struct patient *start = NULL; |
9 | struct patient *ende = NULL; |
10 | |
11 | |
12 | void einlesen(){ |
13 | |
14 | int alter_neu; |
15 | char name_neu, krankheit_neu; |
16 | struct patient *neu; |
17 | |
18 | neu = (struct patient*) malloc(sizeof(struct patient)); |
19 | |
20 | printf("Name des Patienten: "); |
21 | scanf("%c", &name_neu); |
22 | printf("Krankheit des Patienten: "); |
23 | scanf("%c", &krankheit_neu); |
24 | printf("Alter des Patienten: "); |
25 | scanf("%d", &alter_neu); |
26 | |
27 | neu->age = alter_neu; |
28 | neu->name = name_neu; |
29 | neu->illness = krankheit_neu; |
30 | |
31 | |
32 | }
|
--------------------------------------------------------------- Ok ich weiß jetzt, dass man bei strings nicht einfach -> benutzen kann, kann mir aber immer noch nicht vorstellen, wie man es dann machen soll.
:
Bearbeitet durch User
> ... kann mir aber immer noch nicht vorstellen, wie man es dann machen soll.
Das gibt sich. Einfach immer weiter blättern. Das schwarze Gekräusel
sind die Buchstaben.
Fragant schrieb: > kann mir aber immer noch nicht vorstellen, wie man es dann machen soll. Vielleicht ein gutes Buch lesen?
?
1 | void einlesen(){ |
2 | |
3 | ....
|
4 | char name_neu, krankheit_neu; |
5 | ....
|
6 | |
7 | printf("Name des Patienten: "); |
8 | scanf("%c", &name_neu); |
9 | |
10 | ....
|
11 | |
12 | printf("Krankheit des Patienten: "); |
13 | scanf("%c", &krankheit_neu); |
14 | ....
|
1 char für den Namen und 1 char für den Namen der Krankheit? Wie heissen deine Patienten? 'X' und 'Y'? Und die leiden an 'A' oder 'B'? Weisst du was wirklich seltsam ist. Da versucht sich wer an dynamischen Datenstrukturen, konkret verketteten Listen. Das ist ein Thema, das man ca. nach frühestens einem Dreiviertel Jahr C Programmierung angeht und keineswegs trivial ist. Und dann scheitert er an Dingen, die er eigentlich nach 2 Monaten C-Programmierung alle schon beherrschen sollte.
:
Bearbeitet durch User
Fragant schrieb: > Ok ich weiß jetzt, dass man bei strings nicht einfach -> benutzen kann, Doch, kann man. Aber = kann man nicht benutzen! Das eine hat mit dem anderen aber schon sowas von gar nichts zu tun.
:
Bearbeitet durch User
Also so wie ich es verstanden habe, wird strcpy benutzt um Stellen von einem auf den anderen String zu übertragen. Aber was ich gesucht habe, war wie ich einen string eingeben kann. Und wie schaffe ich es dann, diesen string in die struktur zu übertragen, auf die der zeiger neu zeigt.
Fragant schrieb: > Aber was ich gesucht habe, war wie ich einen string eingeben kann. Und > wie schaffe ich es dann, diesen string in die struktur zu übertragen, > auf die der zeiger neu zeigt. Erst mal musst du einen haben! Bis jetzt hast du noch keinen String! Bis jetzt hast du nur eine Variable, die 1 (in Worten: ein) Character aufnehmen kann. 1 Character ist aber kein String!
1 | char name[20]; |
2 | |
3 | scanf( "%s", name ); |
jetzt hast du einen String! Und denn kann man kopieren. Zb in ein anderes char Array
1 | char tmp[20]; |
2 | |
3 | strcpy( tmp, name ); |
oder in ein char-Array, welches in einem Struktur-Objekt steckt
1 | struct person |
2 | {
|
3 | char name[20]; |
4 | };
|
5 | |
6 | int main() |
7 | {
|
8 | struct person pers; |
9 | |
10 | ...
|
11 | |
12 | strcpy( pers.name, name ); |
13 | ...
|
14 | }
|
oder in ein char-Array, welches in einem Struktur-Objekt steckt, auf das man lediglich einen Pointer hat
1 | struct person* pers; |
2 | |
3 | pers = malloc( ..... |
4 | ...
|
5 | |
6 | strcpy( pers->name, name ); |
7 | ...
|
8 | }
|
Ehrlich. C-Buch. Durcharbeiten. Dringend! String-Handling ist in C der erste Stolperstein von ca. 986 weiteren, die noch auf dich warten. Und es ist bei weitem der einfachste zu verstehen. Gegenüber allen anderen Stolpersteinen ist String-Handling nur ein müder Abklatsch.
:
Bearbeitet durch User
Fragant schrieb: > Aber was ich gesucht habe, war wie ich einen string eingeben kann. Die Frage ist, wie sollen die Strings eingegeben werden. Bei Start des Programmes in der Shell oder zur Laufzeit über die Shell oder über eine Textbox in einer GUI? Grundsätzlich würde ich Teilen meiner Vorredner zustimmen, dass Du Dir bezüglich des Themas 'Strings' einmal ein gutes C-Buch aneignen, ausleihen und dann ansehen solltest. Das ist alles machbar und nur halb so wild, vorausgesetzt Du hast die Lust und den Willen einige, wenige Seiten zu lesen. http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/ Das ist gut, umsonst und sollte alle Deine Problemstellungen in Kürze lösen können.
> Grundsätzlich würde ich Teilen meiner Vorredner zustimmen, ...
Welchen Teilen? Nicht meinem Arsch!
Klaus schrieb:
> Welchen Teilen? Nicht meinem Arsch!
Genau diesem Teil nicht. Man muss sich nicht wie ein Rotz am Ärmel
benehmen.
Matthias schrieb: > Klaus schrieb: > >> Welchen Teilen? Nicht meinem Arsch! > > Genau diesem Teil nicht. Man muss sich nicht wie ein Rotz am Ärmel > benehmen. Muss man nicht. Aber es macht Spaß und solange jigdo noch vor sich hinwerkelt ist diese Maschine ohnehin für alles andere unbrauchbar. Aber ich nehme zur Kenntnis, dass Dir meine Art nicht gefällt.
Danke für eure Hilfe, hatten strings überhaupt nicht als thema und werde es mir deshalb demnächst mal in Ruhe anschauen. Brauche aber nochmals eure Hilfe. ------------------------------------------------------------
1 | struct patient{ |
2 | char name[20]; |
3 | char illness[30]; |
4 | int age; |
5 | struct patient *next; |
6 | };
|
7 | |
8 | struct patient *start = NULL; |
9 | struct patient *ende = NULL; |
10 | |
11 | |
12 | void einlesen(){ |
13 | |
14 | int alter_neu; |
15 | char krankheit_neu[30], name_neu[20]; |
16 | |
17 | struct patient *neu; |
18 | |
19 | neu = (struct patient*) malloc(sizeof(struct patient)); |
20 | |
21 | printf("Name des Patienten: "); |
22 | scanf("%s", &name_neu); |
23 | |
24 | printf("Krankheit des Patienten: "); |
25 | scanf("%s", &krankheit_neu); |
26 | |
27 | printf("Alter des Patienten: "); |
28 | scanf("%d", &alter_neu); |
29 | |
30 | neu->age = alter_neu; |
31 | strcpy(neu->name, name_neu); |
32 | strcpy(neu-> illness, krankheit_neu); |
33 | |
34 | |
35 | void ausgabe(){ |
36 | |
37 | struct patient *ptr_anzeige = start; |
38 | while (ptr_anzeige != NULL) |
39 | {
|
40 | printf("%s\n", ptr_anzeige->name); |
41 | printf("%s\n", ptr_anzeige->illness); |
42 | printf("%d\n", ptr_anzeige->age); |
43 | ptr_anzeige = ptr_anzeige->next; |
44 | }
|
45 | printf("\n"); |
46 | |
47 | }
|
------------------------------------------------------------ Bei der Ausgabe kommt folgende Fehlermeldung: Zugriffsverletzung, Fehler beim Lesen der Zeichen der Zeichenfolge. Könnt ihr einen Fehler erkennen?
:
Bearbeitet durch User
Fragant schrieb: > Könnt ihr einen Fehler erkennen? Unvollständiger Copypaste. Von der Funktion "einlesen" fehlt die schließende Klammer. Icb bin mir ziemlich sicher, dass das nicht der einzige Unterschied zwischen dem, was du testest, und dem, was du uns zeigst, ist. > Bei der Ausgabe kommt folgende > Fehlermeldung: > Zugriffsverletzung, Fehler beim Lesen der Zeichen der Zeichenfolge. Ansonsten: beim Einlesen initialisierst du "next" nicht. Das muss demnach nicht zwingend NULL sein. malloc garantiert dir keinen mit Nullen initialisierten Speicher.
> strcpy(neu-> illness, krankheit_neu);
Soll das so sein?
Ich würde Dir den Einsatz eines Debuggers, wahlweise GDB empfehlen.
Starte gdb mit dem Executable, setze mit 'break main' einen Breakpunkt,
starte das Ganze mit 'run' und gehe Zeile für Zeile durch den Code.
Solltest Du hier Hilfe benötigen, findest Du eine kurze Referenz über
'man gdb' in der Shell.
Beim einlesen von einem String, kommt kein & beim scanf hin. Der Name vom Array ergibt schon die Adresse vom ersten Element. name_neu ist gleich &name_neu[0] Beide sind vom Typ char*. Bedenke abei, dass scanf bei %s Whitespace als Trennzeichen nimmt und somit das Einlesen abbricht. Auch wäre eine Längenbegrenzung besser:
1 | printf("Name des Patienten: "); |
2 | scanf("%19s", name_neu); |
3 | |
4 | printf("Krankheit des Patienten: "); |
5 | scanf("%29s", krankheit_neu); |
Solch triviales Zeug sollte man Singlesteppen koennen. Und falls nicht, andere IDE, oder andere Sprache.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.