我正在尝试在文本文件中搜索字符串,当文本文件如下所示时:
"Naveen; Okies
PSG; Diploma
SREC; BECSE"
当输出控制台要求输入字符串时,当我键入 naveen 时,它将导致打印 Okies,当我键入 PSG 时,它将打印文凭。这工作正常,因为我正在使用以下代码:
fscanf(fp, "%[^;];%s\n", temp, Mean);
但是下面的文本文件不起作用,
"Naveen; Okies Is it working
PSG; Diploma Is it working
SREC; BECSE Is it working"
我的代码仍然给我 Okies 作为 Naveen 的输出,我需要“Okies Is it working”作为输出。
所以我将我的代码更改为 fscanf(fp, "%[^;];%[^\n]s", temp, Mean);
我得到“Okies Is it working ' 作为输出。但是对于搜索字符串,它不是搜索下一行。当我搜索 PSG 时,我没有得到任何输出。
请帮助我理解我的问题。
最佳答案
侧边栏
请注意,您应该检查 fscanf()
的返回值。
你说你试过了:
fscanf(fp, "%[^;];%[^\n]s", temp, Mean);
这可能是一种困惑的格式。末尾的 s
正在寻找输入中的文字 s
,但永远不会找到它,而且您也无法知道它是否未找到。 %[^\n]
扫描集转换规范查找一系列“非换行符”。它只会在下一个字符是换行符或 EOF 时停止。 s
因此是永远不会匹配的文字 s
。但是 fscanf()
的返回值是成功转换的次数,可能是 2。您无法确定是否读取了 s
。它应该从格式字符串中删除。
主要答案
为了解决您的主要问题,%s
格式在第一个空白处停止。如果要处理整行,请不要使用 %s
。使用 POSIX getline()
或标准 C fgets()
读取该行,然后对其进行分析。
你可以用strtok()
来分析它.我不会在任何库代码中这样做,因为任何调用 strtok()
的库函数都不能从可能也使用 strtok()
的代码中使用,它也不能调用该函数或其直接或间接调用的函数之一使用 strtok()
的任何函数。 strtok()
函数是有毒的——您一次只能在一个函数中使用它。这些意见不适用于
strtok_r()
或类似的 Microsoft 提供的变体 strtok_s()
— 这与 C11 的可选附件 K 中定义的 strtok_s()
相似但不同。带有后缀的变体是可重入的,不会像 strtok()
那样毒化系统。
我可能会使用 strchr()
在这方面;你也可以看看
strstr()
,
strpbrk()
,
strspn()
,
strcpsn()
.所有这些都是标准的 C 函数,并且自 C89/C90 以来一直存在。
关于c - 从包含空格的文件中读取字符串并在 C 中搜索文件中的给定字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32298539/