【问题标题】:Parsing a char array in c在c中解析一个char数组
【发布时间】:2011-04-15 02:24:09
【问题描述】:

我正在尝试解析一个 c 字符数组。它是上课用的,所以我必须使用 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:

【问题讨论】:

  • 在这种情况下“解析”是什么意思?(提示提示)
  • 它在我的机器上运行良好。 str="[1234]" 时应该有什么输出?
  • [1234] 应该输出 1234 但它对我不起作用。我找到了答案——见下文。我的数组大小不正确。
  • 我不知道你的“不匹配”从何而来。我在您的代码中看不到任何会打印“不匹配”的内容。我认为可以肯定地说您的代码在这种情况下甚至没有运行,这意味着问题出在其他地方。根本与您的代码无关。从“不匹配”消息的格式来看,我什至猜测它来自您的操作系统,这意味着您的“parsemem”程序甚至没有运行。
  • “不匹配”消息看起来像是来自 shell 的消息,它可能会将 [1234] 解释为某种特殊表达式。尝试将其作为./parsemem '[1234]' 运行,即将参数包含在单引号中。

标签: c pointers tokenize


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢。就是这样。我更改了数组大小,它按预期工作......将字符串“[1234]”拆分为标记:ip1:1234,ip2:var1:1234,var2:
猜你喜欢
  • 1970-01-01
  • 2021-04-03
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多