Autor Beitrag
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: Fr 20.02.15 18:12 
Hi, ich bastel gerade etwas mit C herum und habe eine Funktion geschrieben, die abhängig von der Länge des jeweiligen Strings im struct, die Eingabelänge beschränkt um nicht über die Länge des Arrays herausschreiben zu können.
Mir war es dabei wichtig das ganze dynamisch zu halten und ich habe absichtlich für die Länge der Strings keinen Define benutzt.
Mich würde aber interessieren ob sich so etwas leichter bzw. besser lösen lässt. Wenn jemand eine Idee hat würde ich mich über eine entsprechende Antwort freuen.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
struct s_person {
  char Name[41], Vorname[41];
  char Telefonnummer[21];
  struct s_datum Geburtstag;
};
.....
void read_person(struct s_person *sp) {
  char sf_param[40] = {"%"}, c; // needed to create variable format params
  printf("Einlesen einer Person\n");
  printf("Name (%ld Zeichen): \n", (longsizeof(sp->Name)-1); // -1 cause of the string terminator '\0'
  sprintf(sf_param+1"%lds", (longsizeof(sp->Name)-1); // creates a variable format param for scanf depending on given type length
  scanf(sf_param, sp->Name);
  while((c = getchar()) != '\n' && c != EOF); // clear remaining characters from stdin buffer
  printf("Vorname (%ld Zeichen): \n", (longsizeof(sp->Vorname)-1);
  sprintf(sf_param+1"%lds", (longsizeof(sp->Vorname)-1);
  scanf(sf_param, sp->Vorname);
  while((c = getchar()) != '\n' && c != EOF); // ...
  printf("Telefonnummer (%ld Zeichen): \n", (longsizeof(sp->Telefonnummer)-1);
  sprintf(sf_param+1"%lds", (longsizeof(sp->Telefonnummer)-1);
  scanf(sf_param, sp->Telefonnummer);
  while((c = getchar()) != '\n' && c != EOF); // ...
  printf("%s", sp->Vorname);
}


Danke im Voraus. :)


Zuletzt bearbeitet von thepaine91 am Fr 20.02.15 20:22, insgesamt 1-mal bearbeitet
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 20.02.15 19:38 
Hallo,

leider unterstützt scanf im Gegensatz zu printf ja nicht die variable Angabe der Größe als Parameter (bei printf mit "%*s").
Daher ist dein Ansatz schon so in Ordnung. Ich würde daraus dann aber eine eigene Funktion machen.

Wenn du den MS Compiler benutzt, könntest du natürlich auch scanf_s benutzen.
thepaine91 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: Fr 20.02.15 20:21 
Hi
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Hallo,

leider unterstützt scanf im Gegensatz zu printf ja nicht die variable Angabe der Größe als Parameter (bei printf mit "%*s").
Daher ist dein Ansatz schon so in Ordnung. Ich würde daraus dann aber eine eigene Funktion machen.

Wenn du den MS Compiler benutzt, könntest du natürlich auch scanf_s benutzen.


daraus eine Funktion zu machen wäre wirklich besser, ein guter Hinweis also.
Ich hatte vergessen zu erwähnen, dass ich gezielt auf scanf_s verzichtet habe, aber du hast natürlich recht.