gpt4 book ai didi

c - C 中的匹配字符串模式平面文件

转载 作者:行者123 更新时间:2023-11-30 16:11:38 25 4
gpt4 key购买 nike

只是看一下列表中的名称,当匹配时,该值会打折。

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

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

最佳答案

这很好用

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


关于c - C 中的匹配字符串模式平面文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58567581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com