c - 用C中的空格分割每一行

标签 c file parsing

我有一个包含格式行的文件:

<string><spaces><string><spaces><string>

我不知道每个字符串之间的空格数。我想解析该行并将每个字符串插入到一个变量中(第一个字符串代表一个名字,第二个代表姓氏,第三个代表 id)。我看到我可以使用 strtok 但我不喜欢使用它,而是一个遍历该行的循环。

我还发现我可以使用:

if(fscanf(party_data,"%s %s %s",name,last,id) != 3){
   break;
}

但我认为 while 循环更好。 while 循环的问题是我不知道每个字符串之间的空格数量。我的目标是创建一个函数 parseLine,它获取三个指针(name、last 和 id)并解析该行。该函数应该是什么样子?

最佳答案

scanf(或其表兄弟,如 fscanfsscanfvfscanf 格式字符串中的单个空格字符code> 等)可以匹配输入中任意数量的空白(不仅包括空格,还包括制表符、垂直制表符和换行符),因此您的 fscanf 调用可能是现在很好。哦,除了一个细节:你通常想避免一个简单的 %s 转换,并使用类似的东西:

char dest[16];
scanf("%15s", dest);

也就是说,您总是希望指定最大大小,它应该比您提供的缓冲区大小小一个。

如果您不想使用 scanf 和公司,您有几个选择。您可以从 strspnstrcspn 开始,或者您可以只使用带有 isspace 的 while 循环:

char *line = /* whatever*/;

while (!isspace(*line))
   *first++ = *line++;
*first = '\0';

while (isspace(*line))
    ++line;

while (*isspace(*line))
    *second++ = *line++;
*second = '\0';

while (isspace(*line))
    ++line;

while (*isspace(*line))
    *third++ = *line++;
*third = '\0';

在实际使用中,您还需要跟踪目标缓冲区的长度,并且只复制它实际可以容纳的数量(或者计算出每个需要的大小,并相应地分配)。

哦,还有一个小细节:当您调用 isspace 时,您真的应该将其操作数转换为 unsigned char。如果不强制转换,将它用于某些非英语字符(例如,带有重音符号、unlauts 等)会产生未定义的行为。

关于c - 用C中的空格分割每一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57682090/

相关文章:

string - 为什么使用 Golang 设置的文件权限与预期不同?

java - 将相对路径作为属性文件中的属性

html - 将纯文本列表转换为 html

android - 如何通过 Intent 在另一个应用程序中打开本地应用程序文件?

java - 日期值格式错误

Javascript 从 xmlhttpresponse 解析响应文本

c - 在C中打印双向链表的下一个和上一个值

c - SIM908 - 分段下载 FTP 文件

Windows 上的 C 编程 - 适合曾经在 Ubuntu 上使用过的人

c - 在 C 中返回 char[] 值