C eingegebenen Text als Liste an Funktion schicken?



  • Hi 😃

    Ich versuche eine Liste mit Usern von stdin zu sammeln, und will dann
    diese Liste an eine Function weitergeben In der Schleife geht das,
    aber es soll erst am Ende gemacht werden. count wird leider immer von der letzten Eingabe ueberschrieben. Was mache ich da hauptsaechlich falsch?
    Kann man den ganzen Datenstream als Rueckgabewert realisieren?

    #include<stdio.h>
    #include<string.h>
    
    int main()  {
    
    const char *buf = "NULL";
    unsigned char count;
    int i = 0;
    
         #define LEN 255  /* who has such a long username? */
    
         printf("Enter User, ^D to quit:\n");
    
         while (!feof(stdin)) {
    
                 scanf("%s",&buf);
    
               if(strlen(&buf)>LEN) {
                   printf("User too long:\n"); 
                  exit(1);
               } 
    
               printf("Users: %s\n", &buf); 
               i++;
               count += &buf[i];
    
         }
             printf("count: %d, data: %s\n", i-1, &count); /* hnng */
             printf("\ndone\n.");
    
    }
    


  • Dein Hauptproblem ist das du nicht mit strings sondern mit chars arbeitest. Guck dir nochmal an wie man in C strings darstellt und behandelt. Dafür gibt es Funktionen wie strcpy und so weiter.
    Ist zwar kein Fehler aber ich würde kein #define mitten im Quelltext platzieren. Der Übersichtlichkeit nur am Anfang der Datei.

    schirrmie



  • Vielen Dank fuer den Hinweis. Ich experimentier grade mit strcpy und strcat. 🙂



  • #include<stdio.h>
    #include<string.h>
    
    int main(){
    
    char buf[128];
    char out[2048];
    int i;
    #define LEN 255
    
    while (!feof(stdin)) { 
    i = 1; 
    scanf("%s", &buf[i]);
    
     if(strlen(&buf)>LEN) {
                   printf("Username too long\n");
                  exit(1);
     }
    
     if (!isascii(buf[i]){
                 prinf("What?");
                exit(1);
     }
    
    strcat(&out[i], ","); /* separate each user */
    strcat(&out[i], &buf[i]);
    }
    
    printf("out:%s\n", &out[i]);
    }
    

    Also so klappt das erstmal. Jetzt muss man nur noch strcat durch strncat ersetzen, bzw gruebele ich, wie man &out[i] an eine andere Funktion weiter-
    geben kann.(return, aber das nimmt doch nur integer, oder?)

    Gruss from Outta Space 😃
    Spaceinvader



  • Mein Tipp, wenn man mit Arrays arbeitet: Erst denken, dann programmieren.

    Das dein Programm ohne Segfaults läuft ist ein Wunder.

    char buf[128];
    
    while (!feof(stdin)) { 
      i = 1; 
      scanf("%s", &buf[i]);
    ...
    

    Autsch! scanf("%s" erwartet einen Zeiger auf ein Char-Feld. In deinem Fall hast du Glück, dass du i immer auf 1 setzt, denn &buf[1] liefert die Adresse des Array-Elements mit index 1. Richtig wäre

    while (!feof(stdin)) { 
      scanf("%s", buf);
    
    while (!feof(stdin)) {
        scanf("%s",&buf);
    ...
    

    besser, aber es liefert nicht immer das, was du willst. Angenommen, buf ist char* und zeigt auf ein durch malloc/realloc dynamisch angelegtes Feld, dann ist buf != &buf.

    if(strlen(&buf)>LEN)
    

    siehe die vorige Antwort. Am besten einfach strlen(buf) benutzen.

    printf("Users: %s\n", &buf);
    

    siehe die vorige Antwort.

    i++;
    count += &buf[i];
    

    😕 was soll das? Was willst du überhupt machen? Außerdemm hast du 'count' nicht initialisiert.

    strcat(&out[i], ","); /* separate each user */ 
    strcat(&out[i], &buf[i]);
    

    irgendwas scheinst du nicht verstanden zu haben. Ein char out[2048] ist ein Char-Feld, wo du eine Zeichenkette speichern kannst, die höchstens 2047 Zeichen lang ist. Ein char out[2048] ist kein Feld, welches 2048 Strings speichern kann. Mit "strcat(&out[i], &buf[i]);" überschreibst du dir ständig deine Strings.

    * * *

    Ich würde an deiner Stelle man: fgets(3) oder man: fgetc(3) anstelle von scanf nehmen, denn es ist einfacher eine ganze Zeile zu lesen und diese dann mit sscanf zu parsen, als mit scanf zu arbeiten, sonst musst man sehr oft sich mit das Pufferleeren von stdin kümmern und das ist nervig.


Anmelden zum Antworten