c - 从包含空格的文件中读取字符串并在 C 中搜索文件中的给定字符串

标签 c string

我正在尝试在文本文件中搜索字符串,当文本文件如下所示时:

"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/

相关文章:

python:正则表达式匹配字符串且仅匹配字符串

C - 我的内存释放功能有什么问题?

Python C API unicode 参数

c - 为什么 sizeof(x++) 不增加 x?

c - 打开具有连续文件名的文件

ios - 用于 HackerRank 的 Swift String API 替代品

Python - 格式化一个大字符串

c - C 中的意外行为

Python - 使用 for 循环而不是 Split 方法或任何其他方式提取子字符串

c - 对于 C 中的结构体,下面的代码意味着什么?