0

我已经很长时间没有处理 C 中的数组了。

所以我需要在 char 的数组中找到多个字符串的序列实际上我需要它们来解析一些命令行

例子:

char *myArray=" go where:\"here\" when:\"i dont know ...\";

我需要找出应用程序运行时指定的参数是什么我已经完成了一些功能但结果很奇怪

void splitString(char *from ,char start ,char end ,char *into)
{
    int size=strlen(from);
    for(int i=0;i<size;i++)
    {
        if(from[i]==start)
        {
            for(int j=i;j<size;j++){
                if(from[j]!=end)
                    into+=from[j];
                else
                    break;
            }
        }
        break;
    }

}

和电话

char *into;
char *from="this is #string# i want to look for ";
splitString(from,'#','#',into);

导致以下对话框

4

3 回答 3

1

我认为您必须在收到数据时终止字符串。并将 j 增加到 i+1

void splitString(char *from ,char start ,char end ,char *into)
{
  int k = 0;
  int size=strlen(from);
  for(int i=0;i<size;i++)
  {
    if(from[i]==start)
    {
        for(int j=i+1, k = 0;j<size;j++, k++){
            if(from[j]!=end)
                into[k]=from[j];
            else
                break;
        }
    }
    break;
}

into[k] = '\0';
}
于 2012-09-21T11:43:57.050 回答
0

您的代码存在三个主要问题。

第一个是线

into+=from[j];

不复制字符,它增加了本地指针。请参阅 kTekkie 的答案如何解决这个问题。第二个是您不会终止复制到的字符串,这也在 kTekkie 的答案中。

第三个主要问题是您没有为into变量分配内存,因此当您开始正确复制字符时,您将复制到任何into指向的位置,这将是一个随机内存位置。这是未定义的行为,很可能会导致您的程序崩溃。为了解决这个问题,要么创建into一个像这样的数组

char into[SOME_SIZE];

或在堆上动态分配内存malloc

char *into = malloc(SOME_SIZE);

如果您选择动态分配,请记住free在不再需要时分配的内存。

编辑:仔细看看这个功能......

除了我的回答中描述的问题之外,您的功能还有其他一些问题。一种是你break在外循环中有一个语句,所以它会立即跳出循环。

我实际上会这样写:

void splitString(char *from, char start, char end, char *into)
{
    /* Really first we make sure the output string can be printed by terminating it */
    *into = '\0';

    /* First find the `start` character */
    while (*from && *from++ != start)
        ;

    /* Now we are either at the end of the string, or found the character */
    if (!*from)
        return;  /* At end of string, character not found */

    /* Copy the string while we don't see the `end` character */
    while (*from && *from != end)
        *into++ = *from++;

    /* Now terminate the output string */
    *into = '\0';
}

它有效,可以在这里看到。上一个链接还显示了如何调用它。

于 2012-09-21T12:17:28.527 回答
-1

今日话题:http ://www.cplusplus.com/reference/clibrary/cstring/strtok/

/* strtok example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="- This, a sample string.";
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str," ,.-");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.-");
  }
  return 0;
}
于 2012-09-21T11:39:55.730 回答