Die uns mittlerweile hinreichend bekannten Ein- bzw. Ausgabe-Funktionen scanf() bzw. printf() kommen auch in Betracht, um Zeichenketten einzulesen oder auszugeben. Beide kennen die Format-Zeichenkette%s, um Argumente als Strings zu behandeln. Unter Berücksichtigung der zusätzlich zur Verfügung stehenden Modifizierer bieten sie erhebliche Möglichkeiten der Ein- und Ausgabe-Kontrolle. Folgendes Beispiel demonstriert die Anwendung von scanf() bzw. printf() auf Strings:
#include
int main(void){
char szHello[21]; /* Platz für 20 Zeichen + '\0' */
printf("\nGeben Sie eine originelle Begrüßung ein! " "(max. 20 Zeichen)\n");
/* Für szHello ist kein Adreßoperator erforderlich! */
scanf("%20s", szHello);
printf("szHello:%s\n", szHello);
printf("Sagen Sie zum Abschied ");
fflush(stdin);
scanf("%20['a-z']s", szHello);
/* formatiert die Ausgabe rechtsbündig und
* füllt links bei Bedarf mit Leerzeichen auf
*/
printf("szHello:%20s\n", szHello);
return 0;}
Die Feldbreitenangabe mit 20 bei scanf() stellt sicher, daß nicht mehr Zeichen eingelesen werden, als in szHello Platz finden.
String Einlesen C 3
printf ( "%s \n ", text);
ASCII-Zeichen
Die Zahlen im Array kannst Du in der ASCII-Tabelle nachschlagen. Aber seien wir ehrlich - wer will das schon? Den ASCII -Wert eines Zeichens erhält man in C ganz einfach, in dem man das Zeichen in einfache Hochkommas setzt. Beliebig langen String einlesen in c | [HaBo]. Und weil wir auch keine Lust haben, bei jedem Text die Buchstaben zu zählen, überlassen wir das Zählen auch dem Compiler in dem wir keine Größe des Arrays erzwingen, wie wir es in der vorherigen Lektion schon gelernt haben:
char text [] = { 'p', 'r', 'o', 'g', 'g', 'e', 'n', '. ', 'o', 'r', 'g', ' \0 '};
Auch das Nullbyte habe ich hier als Nullzeichen in Hochkommas gesetzt. Für den Compiler spielt es keine Rolle, ob Du 0 oder '\0' schreibst, in beiden Fällen wird ein Char mit 0 beschrieben. Warum mache ich mir dann die Mühe, statt einer Ziffer umständlich '\0' zu schreiben? Es ändert das ausführbare Programm nicht, aber es ändert den Quelltext: Man kann so ganz klar sehen, dass es sich um ein Nullbyte handelt, das einen C-String beendet.
String Einlesen C Chord
Mit dem Newline ('\n')-Zeichen wechselt man in die nächste Zeile:
char string [] = "Tolles Programm \n (c) by Programmierer \n \n ";
Das lässt sich auch schöner schreiben, doch C verlangt, dass ein String am Ende der Zeile abgeschlossen wird. Allerdings werden Strings zusammengefügt, wenn sie aufeinander treffen. Der String "Dies ist ein Text. " lässt sich in C auch so zusammenstellen:
char string [] = "Dies" " " "ist" " " "ein" " " "Text. ";
Dies lässt sich für längere Texte nutzen, so dass sie weiterhin auch im Quelltext gut lesbar sind:
char string [] = "Tolles Programm \n "
"(c) by Programmierer \n \n ";
Wir haben uns das Character-Array genauer angesehen und gesehen, dass C-Strings kürzer sind als das Array in dem sie stehen und durch ein Nullbyte abgeschlossen werden. String einlesen - C, C++ & Objective-C - easy-coding.de. Wir haben die unterschiedliche Schreibweisen für das ASCII -Zeichen '0', das Nullbytes ('\0') und den Zahlenwert Null (0) kennengelernt. Wir können Char-Arrays initialisieren und auf ihre Länge untersuchen oder besondere Zeichen suchen und haben uns angesehen, wie lange bzw. mehrzeilige Strings im Quelltext gut lesbar dargestellt werden können.
String Einlesen C Program
Dies hat den einfachen Grund, dass Arrays sofort in Zeiger umgewandelt werden (zerfallen) und somit nie wirklich ein Array an eine Funktion übergeben wird. Besonders Anfänger verwirrt dieser Umstand recht häufig, aber diese Umwandlung gilt wirklich nur für die formalen Parameter einer Funktion! Jetzt ist Ihnen zwar bekannt, dass ein Array an eine Funktion als Referenz (auf eine Adresse) übergeben wird. Wie aber ist vorzugehen, wenn ein Array unbedingt als Kopie übergeben werden soll? Sie können das Array in eine Struktur verpacken und dann an die Funktion übergeben. String einlesen c 3. Näheres zu den Strukturen erfahren Sie weiter unten. Für den Fall der Fälle folgt hier das Beispiel dazu:
/* array11. c */
struct array{ int wert[3];};
void output_array(struct array z) {
for(i = 0; i < sizeof(struct array) / sizeof(int); i++)
printf("%d\t", [i]);
struct array new_array;
[0] = 10;
[1] = 20;
[2] = 30;
/* call-by-value */
output_array(new_array);
return EXIT_SUCCESS;} Ihre Meinung
Wie hat Ihnen das Openbook gefallen?
String Einlesen C Scanf
Und auch Annex J macht nur Sinn wenn void main() nicht verboten ist, denn warum sollte der Standard in diesem Fall explizit erwähnen, dass die Verwendung von etwas Verbotenem zu unspezifiziertem Verhalten führt. String einlesen c chord. Meiner Meinung nach sind durch 5. 1 also auch beliebige implementationsspezifische Versionen von main erlaubt, aber laut 5. 3 und Annex J ist der Rückgabewert an den Aufrufer in diesen Fällen offensichtlich nicht standardisiert und hängt somit vom verwendeten Compiler ab. Damit ist klar, dass man int main() verwenden sollte, man muss aber nicht.
String Einlesen C O
»
Coding »
C, C++ & Objective-C »
This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy. 1
Hallo,
zZ. programmiere ich in C und ich hab mich gefragt was denn wohl die beste Methode ist einen String einzulesen bzw. einen String einzulesen, der dynamisch in seiner Länge ist. Mir fallen jetzt ganz spontan drei Möglichkeiten ein, ich frage mich aber ob ihr nicht vielleicht eine bessere Methode kennt. Bin noch relativ unerfahren. Also Methode 1 und 2 gehen über die Funktionen scanf(), fgets(). Das Problem bei scanf ist dass es scheinbar immer nur das erste Wort eines Satzes einliest. Dasselbe Problem wird bei fgets() gelöst, nur ist der String immer noch ziemlich statisch bzw. ich muss halt immer ein chararray davor mit fester Länge definieren. Die dritte Methode kann ich mir nur denken, nur frag ich mich ob die wirklich sozusagen "effizient" ist. Stichwort verkettete Listen. Aber ist das wirklich gut? Habt ihr nicht vielleicht ein paar Tipps. P. String einlesen c scanf. S. : übrigens ich bin jetzt von Visual C++ auf GTK umgestiegen
2
Boaah, solche wie Du freuen sich immer wenn sie solche wie mich treffen
hier hast du es
zu deinem Anliegen, ich meine mich zu erinnern auch in C eine abstrakte Klasse String verwendet zu haben.
#6
@AndrewPoison: Das ist kein C(++)-Builder eigenes Konstrukt, sondern entspricht der Ansi-C++ Streamverarbeitung...
#16
Na wenn schon muss der Paragraph 5. 1. 2. 1 ganz zitiert werden (siehe auch hier):
The function called at program startup is named main. The implementation declares noprototype for this function. It shall be defined with a return type of int and with no parameters:
int main(void) { /*... */}
or with two parameters (referred to here as argc and argv, though any names may be used, as they are local to the function in which they are declared):
int main(int argc, char *argv[]) { /*... */}
or equivalent; or in some other implementation-defined manner. Wenn dein Compiler also void main() als gültig definiert dann kannst du ganz im Sinne des Standards auch void main() verwenden. Natürlich sollte man der Portabilität wegen trotzdem immer int main() verwenden. #18
5. 3 sagt aber doch durch die Fallunterscheidung zwischen int main() und nicht int main() recht deutlich, dass beide Fälle möglich sind (ansonsten müsste ja nur etwas über int main() ausgesagt werden).