我正在尝试解析c char数组。这是为了课堂,所以我必须使用c。我在分割令牌时遇到了问题
我需要能够接受以下格式的两个不同参数: [1234] 要么 [1234 abcd]
当我解析“[1234 abcd]”时,我没有任何问题。但是,当我尝试解析“[1234]”时,我得到一个“不匹配”的错误。虽然,当我尝试“[1234]”时,我没有任何问题。
谁能告诉我为什么会这样呢?
以下是我的测试代码:
$ ./parsemem
Splitting string "[1234 abcd]" into tokens:
ip1:1234, ip2:abcd
var1:1234, var2:abcd
parsemem.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//int parse()
int parse(char *str, char *v1, char *v2)
{
char string[11];
strcpy(string,str);
char * pch;
char ip[1][5];
int i=0;
printf ("Splitting string \"%s\" into tokens:\n",string);
pch = strtok (string," []");
while (pch != NULL)
{
strcpy(ip[i],pch);
pch = strtok (NULL, " []");
i++;
}
printf("ip1:%d, ip2:%s\n", atoi(ip[0]), ip[1]);
strcpy(v1,ip[0]);
strcpy(v2,ip[1]);
return 0;
}
int main()
{
char str[] ="[1234 abcd]";
//char str[] ="[1234]";
//char str[] ="[1234 ]";
char var1[5];
char var2[5];
parse(str,var1,var2);
printf("var1:%d, var2:%s\n", atoi(var1), var2);
}
@AndreyT
我又遇到了类似的问题。当我尝试使用[1234]作为参数将其集成到我的程序中时,我得到“不匹配。”虽然如果我在[1234]之前放置一个空格,那么strtok没有问题。
在我的字符串末尾有我想要标记化是一个问题。任何想法为什么会这样?
$./parsemem [1234]
./parsemem: No match.
$./parsemem [1234 ]
Splitting string " [1234" into tokens:
ip1:1234, ip2:
var1:1234, var2:
答案 0 :(得分:5)
String "[1234 abcd]"
需要一个大小为12的char数组(至少)。在parse
内你将它复制到11号数组中。为什么?
此外,您的ip
数组以第一个大小1
声明,这意味着访问ip[1]
是非法的。您只能访问ip[0]
。
换句话说,你的代码在几个地方无可救药地超越了数组内存。行为未定义。在您修复上述错误(以及任何其他此类错误)之前,任何有关代码运行时行为的问题都没有任何意义。