我有一个包含格式行的文件:
<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
(或其表兄弟,如 fscanf
、sscanf
、vfscanf
格式字符串中的单个空格字符code> 等)可以匹配输入中任意数量的空白(不仅包括空格,还包括制表符、垂直制表符和换行符),因此您的 fscanf
调用可能是现在很好。哦,除了一个细节:你通常想避免一个简单的 %s
转换,并使用类似的东西:
char dest[16];
scanf("%15s", dest);
也就是说,您总是希望指定最大大小,它应该比您提供的缓冲区大小小一个。
如果您不想使用 scanf
和公司,您有几个选择。您可以从 strspn
和 strcspn
开始,或者您可以只使用带有 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/