在c中解析char数组

时间:2011-04-15 02:24:09

标签: c pointers tokenize

我正在尝试解析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:

1 个答案:

答案 0 :(得分:5)

String "[1234 abcd]"需要一个大小为12的char数组(至少)。在parse内你将它复制到11号数组中。为什么?

此外,您的ip数组以第一个大小1声明,这意味着访问ip[1]是非法的。您只能访问ip[0]

换句话说,你的代码在几个地方无可救药地超越了数组内存。行为未定义。在您修复上述错误(以及任何其他此类错误)之前,任何有关代码运行时行为的问题都没有任何意义。