Разбор массива символов в c - PullRequest
1 голос
/ 15 апреля 2011

Я пытаюсь разобрать массив переменных.Это для класса, поэтому я должен использовать 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 Ответ

5 голосов
/ 15 апреля 2011

String "[1234 abcd]" требуется массив символов размером 12 (как минимум).Внутри parse вы копируете его в массив размером 11. Почему?

Кроме того, ваш массив ip объявлен с первым размером 1, что означает, что доступ к ip[1] запрещен.Вы можете получить доступ только к ip[0].

Другими словами, ваш код безнадежно переполняет память массива в нескольких местах.Поведение не определено.Пока вы не исправите вышеуказанные ошибки (и любые другие ошибки такого рода), любые вопросы о поведении вашего кода во время выполнения вообще не будут иметь никакого смысла.

...