Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用多个分隔符分析字符串_C_File_Parsing - Fatal编程技术网

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答案非常有用,但如果你能在我问题的这方面帮助我,那将非常有帮助,因为这是我最棘手的部分