Probleme mit Arrays
-
Hi,
Ich soll für mein Studium ein kleines Programm mit Arrays schreiben.
Es sollen am anfang 2 leere arrays erstellt werden.
Per eingabe solle über die FKT malloc der richtige Speicherplatz angefordert werden.
Die Eingabe entspricht dabei der Anzahl der Buchstaben, welche eingegeben werden wollen vom Benutzer.Danach soll das Programm dies nochmal ausgeben.
The 1. letter:
The 2. letter:
.
.
.und danach noch die Adressen von jedem letter
The adress of the 1. letter:
.
.
.
Dies in hexadec deswegen hab ich auch %p geschrieben.Irgendwie vertragt mein Programm die scanf´s nicht so ganz ka was ich da falsch mache.
#include <stdio.h> #include <stdlib.h> #include <string.h> //gets as input some letters //copies them into another array //the output are the copied letters and the addresses of those letters int main() { //declaration char *input; int malloc_value = 0; int count = 0; char *output; //input instructions and giving each array the right bit size printf("Tell how many letters you want to enter: "); scanf("%d", malloc_value); input = malloc(malloc_value * sizeof(char)); output = malloc(malloc_value * sizeof(char)); printf("Now enter your letters. When finished enter '0'.\n\n"); //gathering input while(count < malloc_value) { printf("Enter %d. letter: ", count + 1 ); scanf("%c", *(input + count)); if(input == 0) { break; } count ++; } //testing strcpy function strcpy(output, input); printf("You have entered:\n\n"); //output of the output-pointer for(count = 0; count < malloc_value; count ++) { printf("The %d. letter = %c\n", count + 1, *(output + count)); } printf("\nAnd the adresses were:\n\n"); //output of the adresses hexadecimal! for(count = 0; count < malloc_value; count ++) { printf("Adress of the %d. letter = %p\n", count + 1, output + count); } //freeing input and output free(input); free(output); return 0; }
Ich weiß nicht so ganz was ich hier falsch mach.
Danke schon mal im voraus
Lg ;).
-
scanf() erwartet die Addresse der Variablen und nicht den Wert.
Also z.B.: scanf("%d", &malloc_value);
-
strcpy erwartet auch als Quelle eine nullterminierte Zeichenkette.
-
Du wirst bei der Eingabe auch Probleme mit der Entertaste bekommen.
Diese gilt auch als Zeichen, das dann auch eingelesen wird.
-
hmm
das versteh ich nicht so ganz.
wenn ich jz scanf("%d", &x) schreibe, dann bekomm ich den wert welcher eingegeben wird an die adresse von x geliefert?und wie funktioniert dass bei dem input ins array?
scanf("%c", *(input + count)); hier muss ich dann statt dem stern einfach garnix schreiben also scanf("%c", (input + count)); damit er mir immer in input[1] input [2] usw weiter reinschreibt?
-
Wenn du dir das als Array besser vorstellen kannst, darfst du auch
scanf("%c", &input[count]);
scheiben.
-
so,
jetzt funktioniert das einlesen.
Leider aber wird folgendes immer doppelt ausgeführt//gathering input while (count < malloc_value) { printf("Enter %d. letter: ", count + 1 ); scanf("%c", &input[count]); if (input == 0) { break; } printf("\n"); count ++; }
es steht nach der eingabe des malloc values folgendes da:
Enter letter 1:
Enter letter 2: (also letter 1 wird übersprungen, das gleiche gilt für alle ungeraden)Sprich ich kann nur letter 2 letter 4 letter 6 usw einen Wert geben...^^
-
Die Entertaste, die du zur Bestätigung drückst, liefert auch ein Zeichen ('\n').
Da wird dann beim zweiten mal eingelesen.
Versuch mal ein Leerzeichen vor dem %c:scanf(" %c", &input[count]);
Das andere Problem ist dein if: Wann soll input (also die Adresse des Speicherbereichs) Null sein?
-
ok das heißt dass müsste dann in etwa so aussehen
for(count_1 = 0; count_1 < malloc_value; count_1 ++) { printf("Enter %d. letter: ", count_1 + 1 ); scanf(" %c", &input[count_1]); if (*(input + count_1) == '0') { break; } }
also gibt mir jedes Enter beim einlesen automatisch ein \n ?
Warum er deswegen jeweils einen Schritt überspringt (Vorallem weil der erste Schritt übersprungen wird) versteh ich nicht so ganz.Wieviele Zeichen kann man mittels einen %c einlesen?
Muss ich da dann 35 mal %c schreiben oder gibts da eine abhilfe?Naja jetzt funktionierts (bis auf das mit mehreren Buchstaben^^)
Vielen Danke Leute
Lg
-
Bei dem if kannst du statt
*(input + count_1)
besserinput[count_1]
schreiben. Das liest sich besser.richard92 schrieb:
also gibt mir jedes Enter beim einlesen automatisch ein \n ?
JA.
richard92 schrieb:
Warum er deswegen jeweils einen Schritt überspringt (Vorallem weil der erste Schritt übersprungen wird) versteh ich nicht so ganz.
scanf hört auf zu lesen, wenn ein Zeichen nicht mehr zum Formatspecifier passt (und schreibt dieses letzte Zeichen wieder zurück).
Bei demscanf("%d", malloc_value);
bleibt also ein '\n' übrig.
scanf überliest i.A. Whitespace (Leerzeichen, Tabulatoren, Newline \n und CarriageReturn \r). Bei %c allerdings nicht. Da wird das nächste Zeichen eingelesen.richard92 schrieb:
Naja jetzt funktionierts
Das Leerzeichen im Formatstring bedeutet: Überlese alle Whitespace.
Da kann man alles nachlesen. Schau mal bei der Linkliste für Neulinge nach.