S
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.