gpt4 book ai didi

c - 在C中,如何匹配文件中由某些定界符分隔的字符串?

转载 作者:行者123 更新时间:2023-11-30 21:26:14 24 4
gpt4 key购买 nike

当通过命令行给出参数来搜索文件中由文件中的某个分隔符分隔的字符串时,我们在 C 中使用什么命令/代码?

char searchString[20];
char *src;
f = fopen("passwd", "r");
if (f == NULL)
{
printf("Error while opening the file");
//exit(1);
}
while (fgets(ch, sizeof ch, f)!= NULL)
{
/*printf("%s\n", ch); */

for (j = 1, str = ch; ; j++, str= NULL)
{
char *token = strtok_r(str, ": ", &saveptr);
if (token == NULL)
break;
//printf("%s---\n---", token);
//printf("%s",token);
//printf("%s",strlen(token));

if (strstr(token, argv[2]) != NULL)
{
printf(token);
}

}
//src = strstr(token, argv[2]);
//printf ("String matched");



}


fclose(f);

最佳答案

如果您刚刚开始,您可以将此问题分解为两个步骤。

  1. 每次看到分隔符时,将文件内容分割成多个片段。您可以编写一个循环来查看文件的每个字符,并查看该字符是否与分隔符匹配。如果是,那么您将比较从文件开头(或找到的最后一个分隔符)到找到的新分隔符(或文件结尾)的内容。作为替代方案,您可以使用 strtok函数可以为您在分隔符处分割文件内容。

  2. 在分隔符处分割文件内容后查看每个项目。这可能只是使用 strcmpstrncmp 来比较上一步中找到的条目(或由 strtok 找到的标记)。一般来说,使用 strncmp 更安全,因为如果用户提供的字符串不是以 null 结尾,则不存在程序崩溃的风险。如果您想查找匹配的子字符串,也可以使用 strstr

现在您已经包含了代码,看来您有一个不需要的 for 循环。相反,您可以像这样使用带有 strtok 的 while 循环:

char *token = strtok (str,": ");
while (token != NULL)
{
if (strstr(token, argv[2]) != NULL)
{
printf(token);
}
token = strtok (NULL, ": ");
}

但是,此代码假设您有两个分隔符::。相反,如果您想在冒号和空格的多字符分隔符上进行拆分,您可以引用有关 splitting a string on multiple characters in c 的其他堆栈溢出问题.

strtok 的一个问题是它修改了正在解析的字符串。这意味着如果您想要字符串的原始内容,则需要在其他地方保存字符串的副本。这可以通过使用 strdup 函数创建字符串的副本来完成。执行此操作的代码如下所示:

char *dup = strdup(ch);

要详细说明如何将其更清楚地添加到代码中,您可以这样做:

char* dup;
while (fgets(ch, sizeof ch, f)!= NULL)
{
dup = strdup(ch);

然后在使用 strstr 进行检查时,您可以调用 printf(dup)

正如 @Gangadhar 指出的那样,您可能不需要在分隔符处进行分割(除非您正在搜索的内容包含它们,这意味着如果删除分隔符则什么也找不到)。如果是这种情况,只需使用 strstr 并且不用在分隔符处分割行,那么 ch 指向的字符串将不会被修改,并且可以直接打印按原样。如果您在行尾使用最后一个换行符而不是在 printf 中包含一个换行符,则在他的代码中可能不需要删除换行符;采用这种方法的唯一问题是,如果一行不以换行符结尾。

while (fgets(ch, sizeof ch, fp)!=NULL)
{
if (strstr(ch,argv[2])!= NULL)// check whether argumenttis in line
{
printf("%s\n",ch); // if found print line
}
}

如果要计算当前搜索的标记相对于字符串开头的偏移量,可以利用字符串中的字符存储在连续的内存地址中这一事实。因此,您只需从您正在查看的当前 token 的地址 token 中减去原始字符串中第一个字符的地址 &ch[0] 即可。这行代码可能看起来像这样:

int offset = (int) (token - &ch[0]);

关于c - 在C中,如何匹配文件中由某些定界符分隔的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19332849/

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