0

只是为了查看列表中的名称,匹配时,价值会打折。

我尝试编码,但匹配技术失败。就像我试图找到“约翰”,但它与“约翰”和“约翰尼”匹配,预期匹配是否只是“约翰”(不区分大小写)

只是想帮助我妈妈的商店。我想要的是:我有 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 中做到这一点?感谢您的帮助...

4

1 回答 1

0

这很好用

#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;
}


于 2019-10-26T11:12:00.953 回答