Entwickler-Ecke

Algorithmen, Optimierung und Assembler - C begrenzen von Eingaben mit dynamischer Stringgröße


thepaine91 - Fr 20.02.15 18:12
Titel: C begrenzen von Eingaben mit dynamischer Stringgröße
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.


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. :)


Th69 - 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 [https://msdn.microsoft.com/de-de/library/w40768et.aspx] benutzen.


thepaine91 - 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 [https://msdn.microsoft.com/de-de/library/w40768et.aspx] 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.