在c中解析char数组

Ton*_*ony 1 c pointers tokenize

我正在尝试解析ac char数组.这是为了课堂,所以我必须使用c.我在分割令牌时遇到问题

我需要能够接受以下格式的两个不同参数:[1234]或[1234 abcd]

当我解析"[1234 abcd]"时,我没有任何问题.但是,当我尝试解析"[1234]"时,我得到一个"不匹配"的错误.虽然,当我尝试"[1234]"时,我没有任何问题.

谁能告诉我为什么会这样呢?

以下是我的测试代码:

$ ./parsemem
Splitting string "[1234 abcd]" into tokens:
ip1:1234, ip2:abcd
var1:1234, var2:abcd 
Run Code Online (Sandbox Code Playgroud)

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);

}
Run Code Online (Sandbox Code Playgroud)

@AndreyT

我又遇到了类似的问题.当我尝试使用[1234]作为参数将其集成到我的程序中时,我得到"不匹配."虽然如果我在[1234]之前放置一个空格,那么strtok没有问题.

在我的字符串末尾我想要标记化是一个问题.任何想法为什么会这样?

$./parsemem [1234]
./parsemem: No match.


$./parsemem [1234 ]
Splitting string " [1234" into tokens:
ip1:1234, ip2:
var1:1234, var2:
Run Code Online (Sandbox Code Playgroud)

AnT*_*AnT 5

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

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

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