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

コードには3つの主な問題があります。

1つ目はその行です

into+=from[j];

文字をコピーせず、ローカルポインタを増やします。それを解決する方法については、kTekkieからの回答を参照してください。2つ目は、コピー先の文字列を終了しないことです。これは、kTekkieからの回答にも含まれています。

3番目の大きな問題は、変数にメモリを割り当てないことですinto。そのため、文字を適切にコピーし始めると、任意intoのポイントにコピーします。これは、ランダムなメモリ位置になります。これは未定義の動作であり、プログラムがクラッシュする可能性があります。これを解決するには、次intoのような配列として作成します

char into[SOME_SIZE];

または、ヒープにメモリを動的に割り当てるmalloc

char *into = malloc(SOME_SIZE);

free動的割り当てを使用する場合は、不要になったときに割り当てられたメモリを覚えておいてください。

編集:関数を詳しく見てみましょう...

私の答えで上に説明したもの以外に、あなたの関数には他にもいくつかの問題があります。1つは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 に答える