C 使用多个分隔符分析字符串
我如何解析这样的文本文件: 免责声明:我不能假设我知道文本文件的内容这只是一个示例文本文件C 使用多个分隔符分析字符串,c,file,parsing,C,File,Parsing,我如何解析这样的文本文件: 免责声明:我不能假设我知道文本文件的内容这只是一个示例文本文件 10X16 de4 dw9 ds11 g10,7 M3,4 h6,5 p2,2 M8,5 G2,10 12X20 de7 dw10 dn13 g9,10 M7,8 h6,5 p2,2 M8,5 G2,10 这个文本文件所说的是,有一个尺寸为10X16的房间,东墙上的一扇门de4位于第四个位置,g10,7表示在10Y和7X位置有一块小金子……我不想储存任何字母,这些信只是为了告诉我读这些数字的目的。我想根
10X16 de4 dw9 ds11 g10,7 M3,4 h6,5 p2,2 M8,5 G2,10
12X20 de7 dw10 dn13 g9,10 M7,8 h6,5 p2,2 M8,5 G2,10
这个文本文件所说的是,有一个尺寸为10X16
的房间,东墙上的一扇门de4
位于第四个位置,g10,7
表示在10Y
和7X
位置有一块小金子……我不想储存任何字母,这些信只是为了告诉我读这些数字的目的。我想根据它是什么将数字存储到int
变量中:黄金、怪物、药剂等
其中,我需要将10
存储为Y
值,将16
存储为X
值,维度后的其他元素存储在不同的变量中
这是我的密码:
int main(int argc, char *argv[]) {
//open file and read
FILE *file = fopen(argv[1], "r");
char line[150];
char *dim;
int X = 0;
while (fgets(line, 150, file) != NULL) {
dim = strtok(line, "X");
X = atoi(dim);
printf("%d\n", X);
//parse other elements here?
...
}
fclose(file);
return 0;
}
因此,例如,我希望变量char*roomY
中的10
和char*roomX
中的16
,以及4
存储在变量char*easttoor
中,这些值稍后都将转换为int
值
还有像g10,7
这样的元素,我希望10
存储为该元素的Y
值和7
存储为X
值
我还要补充一点,字母应该用来确定值是多少。
例如,可以使用if(string[i]=“d”)
路径
我尝试的是使用strtok(roomY,“X”)获取
X
,然后int Y=atoi(roomY)
将char
转换为int
值。这只适用于10
,但我在正确解析文件的其余部分时遇到了问题。有更有效的方法吗?我对使用C进行字符串解析的一般建议是:
不要试图在一个大函数中使用嵌套循环、指针、用于不同解析模式的标志等来实现所有功能。这将导致关闭一个错误,访问冲突和不可理解的代码
相反,尝试将问题划分为更简单的任务(函数),如拆分字符串、替换特定字符或创建子字符串。然后组合这些函数以获得所需的结果
或者尝试查找现有的用于字符串操作的库。是。你可以用strtok。秘密在于分隔符字符串可以包含多个分隔符
dim = strtok(line, "X ,");
通常我会让人们尖叫着从斯特克跑开,因为在我看来这是一种奇怪的行为。就你的情况而言,我认为这可能是合理的
这个可以使用“X”、空格和逗号作为分隔符。我希望扫描17个值
12X20 de7 dw10 dn13 g9,10 M7,8 h6,5 p2,2 M8,5 G2,10
这个不一样。注意三个逗号。斯特托克认为那里没有价值。所以我希望扫描15个值。这可能是你需要的,也可能不是。如果您试图解析csv文件,strtok将是错误的选择
12X20 de7 dw10 dn13 g9,10 M7,8 h6,5 p2,,,5 G2,10
我认为解析该文件最简单的方法是使用
strtok
和“
获取基本令牌,然后使用sscanf
根据其标识符对每个令牌进行评估
char* tok = strtok( line, " " );
/* handle first token */
int x, y;
sscanf( tok, "%dX%d", &x, &y );
while( tok = strtok( 0, " " ) )
{
/* handle token depending on text */
switch( *tok )
{
case 'M' :
{
int mx, my;
sscanf( tok, "M%d,%d", &mx, &my );
break;
}
// ...
}
}
请不要以为这只是解决方案的草图。您应该将
开关
移动到一些eval_token
函数以及每种情况中。看一看。sscanf不能帮助我从g7,10这样的元素中解析7和10,或者我不确定您的想法,建议它。为什么不呢<代码>sscanf(“g7,10”,“g%d,%d”,&a和&b)将为您提供a=7和b=10。抱歉,我应该指定我不能假定文本文件的内容。我确信数据可以更改。格式一致吗?如果格式发生变化,那么很可能没有多少代码可以解决问题。好吧,这很有帮助,但问题是我不想存储字母,我想让我的程序读取字母,这样它就知道存储数字的变量是什么,同时它的trtok只会在输入集中的字符串中进行迭代。如何处理每条字符串取决于您自己。你问题的关键部分是把所有的部分都解决掉。关于多个分隔符的小细节应该可以帮助您前进。我如何将它们存储在单个变量中?ie g9,10将是int-goldY=9和int-goldX=10,这确实超出了问题的范围。我理解,但这是我提到的原始问题,你的strtok答案非常有用,但如果你能在我问题的这方面帮助我,那将非常有帮助,因为这是我最棘手的部分