плоский файл сопоставления с образцом строки в C - PullRequest
0 голосов
/ 26 октября 2019

Просто чтобы посмотреть имя в списке, при совпадении значение обесценивается.

Я пытался кодировать, но метод сопоставления не удался. Как я пытаюсь найти «Джона», но он совпадает с «Джоном» и «Джонни», независимо от того, является ли ожидаемое совпадение просто «Джоном» (регистр не чувствителен)

Просто хочу помочь магазину моей мамы. То, что я хочу, это что-то вроде: у меня есть 3 набора плоских файлов (list1.txt, list2.txt, list3.txt). Каждый файл имеет свое имя, например:

John
Rudy
Barrack Obama
John Travolta

Содержит List2.txt:

Jeddi Sarah
Mute Sand

Содержит List3.txt:

Greedy Black
Nevada Blue

Программа при выполнении, спросите:

Enter name: Greedy Black
Enter price: 1000

Если имя указано в list1.txt, он получает скидку 10%, list2.txt на 20% и list3.txt на 30%. Пример вывода:

Enter name: Greedy Black
Enter price: 1000    
Greedy Black is found in list3.txt, got discount for 10%
price after discount: 900

Но если его нет ни в одном списке, он получает нормальную цену, равную 1000. Как я могу это сделать в C? Спасибо за помощь ...

1 Ответ

0 голосов
/ 26 октября 2019

Это прекрасно работает

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define MAX_C 111
char *trim(char *str);
int countlines(const char *filename);
char ** names(const char *filename);

int contains(const char* a)
{
    int l1 = countlines("list1.txt");
    int l2 = countlines("list2.txt");
    int l3 = countlines("list3.txt");

    char** c1 = names("list1.txt");
    char** c2 = names("list2.txt");
    char** c3 = names("list3.txt");



    for (int i = 0; i < l1; ++i) {
        if (strcmp(a,c1[i])== 0 )
            return 1;
    }
    for (int i = 0; i < l2; ++i) {
        if (strcmp(a,c2[i])== 0 )
            return 2;
    }
    for (int i = 0; i < l3; ++i) {
        if (strcmp(a,c3[i])== 0 )
            return 3;
    }
    for (int j = 0; j < l1; ++j) {
        printf("%s\t%s",a,c1[j]);
    }
    return 0;
}

int main()
{
    char  * a = (char * ) malloc(MAX_C);

    printf("Enter Name:\n");
    scanf("%[^\n]",a);
    int p;
    printf("Enter Price:\n");
    scanf("%d",&p);

    int c = contains(a);
    if(c)
    {
        printf("Greedy Black is found in list%d.txt, got discount for 10%%\nprice after discount: %f",c,p-p/10.0);
    }
else
    {
        printf("Greedy Black is found in list%d.txt, got discount for 10%%\nprice Without discount: %f",c,p);
    }


}


int countlines(const char *filename) {
    // count the number of lines in the file called filename
    FILE *fp = fopen(filename, "r");
    int ch = 0;
    int lines = 0;

    if (fp == NULL)
        return 0;

    lines++;
    while ((ch = fgetc(fp)) != EOF) {
        if (ch == '\n')
            lines++;
    }
    fclose(fp);
    return lines;
}
char ** names(const char *filename)
{
    int line = countlines(filename);
    char ** arr = (char **)malloc(line * sizeof(char *));
    for (int i=0; i<line; i++)
        arr[i] = (char *)malloc(MAX_C * sizeof(char));
    FILE * fp = fopen(filename, "r");
    if (fp == NULL) {
        printf("Could not open file %s", filename);
        return NULL;
    }
    for (int i = 0; i < line; ++i) {
        if(fgets(arr[i], MAX_C, fp)!=NULL)
        {
            trim(arr[i]);
        }
    }

    return arr;
}
char *trim(char *str)
{
    size_t len = 0;
    char *frontp = str;
    char *endp = NULL;

    if( str == NULL ) { return NULL; }
    if( str[0] == '\0' ) { return str; }

    len = strlen(str);
    endp = str + len;

    /* Move the front and back pointers to address the first non-whitespace
     * characters from each end.
     */
    while( isspace((unsigned char) *frontp) ) { ++frontp; }
    if( endp != frontp )
    {
        while( isspace((unsigned char) *(--endp)) && endp != frontp ) {}
    }

    if( frontp != str && endp == frontp )
        *str = '\0';
    else if( str + len - 1 != endp )
        *(endp + 1) = '\0';

    /* Shift the string so that it starts at str so that if it's dynamically
     * allocated, we can still free it on the returned pointer.  Note the reuse
     * of endp to mean the front of the string buffer now.
     */
    endp = str;
    if( frontp != str )
    {
        while( *frontp ) { *endp++ = *frontp++; }
        *endp = '\0';
    }

    return str;
}


...