Liste nach durchsuchen, nur erste Zeile ausgeben; Sprache C

jasmin_89

Mitglied
Hallo,

folgendes Problem. Ich habe ein C-Programm geschrieben was mir eine bestimmte Liste nach einem Namen durchsucht. Das Ziel des C-Programmes wäre wie folgt: Ich gebe ein Wort ein z.b JOHNSON.

Dann sollte mir das Programm die Zeile printen in der der Name JOHNSON vorkommt. Allerdings sollten dann nicht alle Zeilen geprintet werden die den Namen JOHNSON haben, sondern nur die erste gefundene Zeile. Aktuell werden alle Zeilen geprintet.

Also bei meinem Beispiel sollte nach dem Suchstring JOHNSON die Ausgabe wie folgt sein:
11775 09/10/1987 JOHNSON WORLDWIDE ASSOCIATES INC JWAIA 17.75000 . 1.00000
11775 22/07/2003 JOHNSON OUTDOORS INC JOUT 14.16900 . 1.00000
11826 31/12/1925 ENDICOTT JOHNSON CORP 68.37500 . 2.00000
22111 25/09/1944 JOHNSON & JOHNSON 34.75000 . 2500.47

Ich stehe aktuell auf dem Schlauch und kann das Problem selbst nicht lösen. Hoffe ich habe mein Problem verständlich erklärt. Danke für eine Hilfestellung.

Hier ist das Beispiel auf onlinegdb: https://onlinegdb.com/v-d2hBX2f
Und hier der Code für das Forum:

C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUF 255

/* Anpassen nach Bedarf... */
const char trennzeichen[] = ".;,:\"\' ";

int main()
{
    FILE *f=fopen("/tmp/abc123", "w");
    fputs("11775    09/10/1987    JOHNSON WORLDWIDE ASSOCIATES INC       JWAIA           17.75000          .         1.00000\n11775    12/10/1987    JOHNSON WORLDWIDE ASSOCIATES INC       JWAIA           17.00000          .         1.00000\n11775    13/10/1987    JOHNSON WORLDWIDE ASSOCIATES INC       JWAIA           18.00000          .         1.00000\n11775    14/10/1987    JOHNSON WORLDWIDE ASSOCIATES INC       JWAIA           17.50000          .         1.00000\n11775    15/10/1987    JOHNSON WORLDWIDE ASSOCIATES INC       JWAIA           17.25000          .         1.00000\n11775    16/10/1987    JOHNSON WORLDWIDE ASSOCIATES INC       JWAIA           16.12500          .         1.00000\n11775    19/10/1987    JOHNSON WORLDWIDE ASSOCIATES INC       JWAIA           14.25000          .         1.00000\n11775    20/10/1987    JOHNSON WORLDWIDE ASSOCIATES INC       JWAIA           12.25000          .         1.00000\n11775    21/10/1987    JOHNSON WORLDWIDE ASSOCIATES INC       JWAIA           14.25000          .         1.00000\n11775    22/07/2003    JOHNSON OUTDOORS INC                   JOUT            14.16900          .         1.00000\n11775    23/07/2003    JOHNSON OUTDOORS INC                   JOUT            14.06000          .         1.00000\n11775    24/07/2003    JOHNSON OUTDOORS INC                   JOUT            14.19000          .         1.00000\n11775    25/07/2003    JOHNSON OUTDOORS INC                   JOUT            15.52000          .         1.00000\n11775    28/07/2003    JOHNSON OUTDOORS INC                   JOUT            14.74900          .         1.00000\n11775    29/07/2003    JOHNSON OUTDOORS INC                   JOUT            14.42900          .         1.00000\n11775    30/07/2003    JOHNSON OUTDOORS INC                   JOUT            14.22000          .         1.00000\n11775    31/07/2003    JOHNSON OUTDOORS INC                   JOUT            14.31900          .         1.00000\n11825    31/12/2021    CYBEROPTICS CORP                       CYBE            46.50000          .         1.00000\n11826    31/12/1925    ENDICOTT JOHNSON CORP                                  68.37500          .         2.00000\n11826    02/01/1926    ENDICOTT JOHNSON CORP                                  68.50000          .         2.00000\n22111    25/09/1944    JOHNSON & JOHNSON                                      34.75000          .         2500.47\n22111    26/09/1944    JOHNSON & JOHNSON                                      34.12500          .         2500.47\n22111    27/09/1944    JOHNSON & JOHNSON                                      33.75000          .         2500.47\n22111    28/09/1944    JOHNSON & JOHNSON                                      33.62500          .         2500.47\n22111    29/09/1944    JOHNSON & JOHNSON                                     -33.87500          .         2500.47\n22111    30/09/1944    JOHNSON & JOHNSON                                     -33.81250          .         2500.47\n22111    02/10/1944    JOHNSON & JOHNSON                                      34.00000          .         2500.47\n22111    03/10/1944    JOHNSON & JOHNSON                                      34.00000          .         2500.47\n22111    04/10/1944    JOHNSON & JOHNSON                                      33.75000          .         2500.47\n",f);
    fclose(f);
   
    f=fopen("/tmp/abc123","r");
   

    char searchstring[BUF];
    char puffer[BUF], puffer_bak[BUF];
    char *word;



    if(f == NULL)
    {
        printf("Fehler bei fopen()...");
        return EXIT_FAILURE;
    }
    printf("Wonach suchen Sie in : ");
    scanf("%s", searchstring);
    printf("\n");
    char *sp;


    while(fgets(puffer, BUF, f) != NULL)
    {
        strcpy(puffer_bak, puffer);
        word = strtok(puffer, trennzeichen);
        while(word != NULL)
        {
            if(strcmp(word,searchstring) == 0)
            {
                printf("%s",puffer_bak);

            }

            word = strtok(NULL,trennzeichen);
        }


    }

    return 0;
}
 

Anhänge

  • testfile.txt
    3,4 KB · Aufrufe: 1
Zuletzt bearbeitet:

Robert Zenz

Top Contributor
Naja, du kannst ja einfach abbrechen nachdem der Begriff gefunden worden ist. Das billigste (in jeglicher Hinsicht) waere vermutlich einfach ein return an der Stelle.
 

jasmin_89

Mitglied
Aber dann wird die Suche ja bei dem Ersten gefundenen Wort abgebrochen. Ich möchte dass dann aber die Suche fortgeführt wird. Aktuell gibt es mir alle Zeilen aus die den Namen JOHNSON enthalten. Die Zeilen die den Namen JOHNSON enthalten unterscheiden sich nur in der Zahl der die erste Spalte hat. Man müsste irgendwie die Zeile speichern und dann mit der neuen Suche die Erste Spalte mit der vorherigen Spalte vergleichen ob diese gleich oder nicht gleich ist.
 

Robert Zenz

Top Contributor
Nochmal langsam. Du willst nur das erste Ergebnis ausgegeben haben, aber die Suche soll dennoch alle finden? Was passiert dann damit?

Du kannst dann einfach alle suchen lassen, dir die in einer Liste merken und dann einfach das erste Element der Liste ausgeben.
 

jasmin_89

Mitglied
So richtig verstehe ich deinen Tipp nicht, da würde ja trotzdem immer nur das erste Element ausgegeben.
Nach einigen Tagen knobeln bin ich selbst auf die Lösung gekommen: https://onlinegdb.com/cKzPoXEKfl

Ich wandle die Erste Spalte, jeweils pro Zeile, in eine Zahl um. Ich speichere diese in einer int Zahl und vergleiche diese mit der vorher eingelesenen. Es funktioniert nun so genau wie ich es mir vorgestellt habe. Ach das ist schön wenn etwas funktioniert.
 

jasmin_89

Mitglied
War nicht genau die Anforderung da es dann sozusagen mehrere erste Zeilen gibt. Vermutlich habe ich mich nicht klar ausgedrückt, deshalb habe ich das Beispiel oben angegeben (damit man es besser versteht). Auf jeden Fall funktioniert mein Programm nun genau so wie ich es haben wollte
 

Ähnliche Java Themen

Neue Themen


Oben