1

\n文字列を分割し、特定のトークンを含む行を配列に配置したいと考えています。

私はこのコードを持っています:

char mydata[100] = 
    "mary likes apples\njim likes playing\nmark hates school\nanne likes mary";
char *token = "likes";
char ** res  = NULL;
char * p = strtok (mydata, "\n");
int n_spaces = 0, i;
/* split string and append tokens to 'res' */
while (p) {
    res = realloc (res, sizeof (char*) * ++n_spaces);
    if (res == NULL)
    exit (-1); /* memory allocation failed */
    if (strstr(p, token))
        res[n_spaces-1] = p;
    p = strtok (NULL, "\n");
}
/* realloc one extra element for the last NULL */
res = realloc (res, sizeof (char*) * (n_spaces+1));
res[n_spaces] = '\0';
/* print the result */
for (i = 0; i < (n_spaces+1); ++i)
    printf ("res[%d] = %s\n", i, res[i]);
/* free the memory allocated */
free (res);

しかし、その後、セグメンテーション違反が発生します。

res[0] = mary likes apples
res[1] = jim likes playing
Segmentation fault

\nCで文字列を正しく分割するにはどうすればよいですか?

4

2 に答える 2

2

これを試して:

char mydata[100] = "mary likes apples\njim likes playing\nmark hates school\nanne likes mary";
char *token = "likes";
char **result = NULL;
int count = 0;
int i;
char *pch;

// split
pch = strtok (mydata,"\n");
while (pch != NULL)
{
    if (strstr(pch, token) != NULL)
    {
        result = (char*)realloc(result, sizeof(char*)*(count+1));
        result[count] = (char*)malloc(strlen(pch)+1);
        strcpy(result[count], pch);
        count++;
    }
    pch = strtok (NULL, "\n");
}

// show and free result
printf("%d results:\n",count);
for (i = 0; i < count; ++i)
{
    printf ("result[%d] = %s\n", i, result[i]);
    free(result[i]);
}
free(result);
于 2013-08-25T13:15:28.553 に答える
2

strstr2 番目の引数の最初の一致へのポインターを返すだけです。

あなたのコードはヌル文字を処理していません。

strcpy文字列のコピーに使用できます。

while (p) {
  // Also you want string only if it contains "likes"

    if (strstr(p, token))
    {
        res = realloc (res, sizeof (char*) * ++n_spaces);
        if (res == NULL)
          exit (-1); 
        res[n_spaces-1] = malloc(sizeof(char)*strlen(p));

        strcpy(res[n_spaces-1],p);
     }
    p = strtok (NULL, "\n");
}

無料でres使用:

for(i = 0; i < n_spaces; i++)
    free(res[i]);
free(res);
于 2013-08-25T13:23:51.790 に答える