gpt4 book ai didi

c - 如何将文本文件中的一行子字符串保存到字符串数组中?

转载 作者:行者123 更新时间:2023-11-30 16:44:50 25 4
gpt4 key购买 nike

我有读取 .txt 文件的代码:

Pancho: Juanka,Cony

这个想法是找到字符':'并将其分开保存在字符串数组中。与 JuankaCony 相同,但相反,当它找到 ',''\0'.

最佳答案

虽然strtok可以解决这个问题,但我相信它不会是一个非常易于维护的解决方案。我打算指出使用 strtok 的一些问题,以及这些问题的解决方案。

<小时/>

问题#1:由于隐藏状态,strtok不可重入非线程安全;如果您尝试同时标记两个字符串(例如,交织函数调用序列或使用多个线程),您将遇到问题。

解决方案 #1: 可以使用 strchrstrcspn 来解决此问题。我已经展示了阅读其他答案中的行的能力 1 , 2 使用strcspn;这些可以很容易地修改为使用 strchr 代替,或使用 '\n' 以外的字符。

<小时/>

问题#2: strtokstrchrstrcspn 都对需要中间数组的字符串进行操作存在于其中。您正在读取文件;如果您不需要该中间数组,因为您可以将字段直接读取到相应的数组中,那么消除它们可能会带来更高级的优化和更干净、更易于维护的代码。

解决方案#2:以下代码 demonstrates使用 fscanf 直接从文件执行分割

#include <stdio.h>

#define WIDTH_STR(width) #width
#define FIXED_FIELD(width) "%" WIDTH_STR(width)
#define TERMINAL(set) "[^" set "]%*1[" set "] "

#define W 1024
int parse(FILE *f) {
char x[W+1], y[W+1], z[W+1];
if (fscanf(f, FIXED_FIELD(W) TERMINAL(":"), x) <= 0) { return EOF; }
if (fscanf(f, FIXED_FIELD(W) TERMINAL(","), y) <= 0) { return EOF; }
if (fscanf(f, FIXED_FIELD(W) TERMINAL("\n"), z) <= 0) { return EOF; }
printf("<%s>\n", x);
printf("<%s>\n", y);
printf("<%s>\n", z);
return 0;
}

int main(void) {
printf("parse returned: %d\n", parse(stdin));
}
<小时/>

问题#3:当您假设字段固定宽度时,所有上述解决方案都达到了最佳最优性(在可维护性/复杂性和计算效率方面)。一旦该假设变得无效,使用 fgetc 一次读取和解析一个字节,并根据需要重新分配以适应可变字段就变得更加有意义 。

解决方案#3:我已经演示了读取 another answer 中可变长度单词的能力。 ,这可以很容易地适应读取单个 token 并将其解析为单独的动态分配。这可能会遭受昂贵的重新分配的缺点,以允许您的用户输入巨大(数兆字节)字段值,这些字段值通常不支持作为具有自动存储持续时间的固定宽度数组。

关于c - 如何将文本文件中的一行子字符串保存到字符串数组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44350577/

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