我想做两件事:
- 1)**
char *myStr = "2 1 3 2 5 2 5 4 6 1 6 2 7 1 7 3 7 4 8 1 ";
我们的目标是让我的字符串是这样的
2 1
3 2
5 2
...
...
依此类推,直到字符串结束。
- 2)**对于这样的字符串,我想将这些值放入一个二维数组中,其形式为myArr [0][0]= 2,myArr [0][1]= 1,myArr [1][0]= 3,myArr [1][1]= 2,依此类推。
我首先尝试使用strtok,但我认为它不合适,因为分隔符不足以解决这个问题,然后通过逐字符迭代来拆分,但到目前为止,我不知道如何做到这一点:
const char * separator = " "
char * strToken = strtok ( out, separator );
while ( strToken != NULL ) {
printf ( "%s\n", strToken);
strToken = strtok ( NULL, separator);
}
我得到是:
2
1
3
2
5
2
5
4
6
1
6
2
7
1
7
3
7
4
8
1
4条答案
按热度按时间dm7nw8vv1#
在C语言中,试图把事情做得很小是很有诱惑力的,但是有时候把事情做得更长会更清楚。
在本例中,您尝试创建一个自定义解析器。有几种方法可以实现这一点,但复杂程度各不相同,但我将介绍一种简单的自顶向下方法,从输入字符串到整数值的二维数组。
你需要跟踪你扫描了字符串多远,以及你在2D数组中添加了什么。我假设这些是恒定长度的,如果需要的话,你可以把它们变成动态的。
基本的操作是扫描一个数字,然后跳过它后面的空格。这里有一个函数。它接受字符指针和一个指向整数的指针,然后返回一个指向下一个数字的指针(跳过错误检查)。
你想一次扫描两个数字,这里有一个函数可以做到这一点。它接受字符指针,和一个一维
int
数组,并返回新的字符指针。最后,你要扫描字符串中的所有对,我假设对的数量是已知的,否则你应该先计算它们的数量,然后为它们分配一个数组,或者使用链表来存储它们。
这样就行了
ruyhziif2#
有一种方法可以将数字存储在一维数组中,然后通过将它们转换为二维数组来显示它们。它不需要依赖于列数的存储过程。
olhwl3o23#
用
strtol
解析内容。下面的代码非常脆弱,需要精确的输入,但它给出了大致的思路:axr492tv4#
我首先尝试使用strtok,但我认为它不合适,因为分隔符不足以解决此问题
这不是使用
strtok
的问题。strtok
的问题是它必须用空终止字符覆盖分隔符,这样单个字段就变成了以空字符终止的字符串。但是,myStr
是指向string literal的指针,不允许修改。因此,如果要使用
strtok
,必须将字符串文字复制到可写的内存缓冲区,或者不将myStr
声明为指向字符串文字的指针,而是声明为可写的char
数组,如下所示:以下是使用
strtok
的解决方案:此程序具有以下输出:
请注意,如果可能的话,通常应该避免使用
goto
。但是,对于脱离嵌套循环,通常没有更好的选择,因此在这种情况下,通常认为它是可以接受的。因为你只处理单个字符而不是字符串,所以你并不需要
strtok
。如果你不需要strtok
,那么你也可以使用一个指向字符串的指针,就像你在问题中定义的那样:下面是一个相应的解决方案:
此程序与第一个程序具有相同的输出。