2

Mac OS X で小さなプログラムを作成しましたが、次の関数で次のエラーが発生します。

プログラムは信号 EXC_BAD_ACCESS を受信しました。メモリにアクセスできませんでした。理由: アドレスの KERN_INVALID_ADDRESS: 0x0000000000000000 0x00007fff99b359c4 in strstr ()

/*
 * attrvalue(): parse an attribute value pair.
 *
 * takes a string of the form "ATTRIBUTE = VALUE" and returns the atrribute name
 * and value as seperate strings
 *
 */
  int
 attrvalue(char *entry, char **attr, char **value)
 {
    char           *copy;
    char           *p;

    if (!entry || *entry == '\0')
            return 1;

    copy = strdup(entry);

    *attr = strtok(copy, "=");
    *value = strtok(NULL, "\n");

    /* strip training whitespace from attr and value */
    p = strstr(*attr, "     ");
    if(p)
      *p = '\0';
    p = strstr(*value, "   ");
    if(p)
      *p = '\0';
    return (0);
}

ここでこの関数の何が問題なのか考えていますか?

ありがとう。

4

1 に答える 1

0

修正された回答: attr または value の先頭に空白がない (つまり、行の先頭と attr 文字列、または等号と値文字列の間にスペースがない) と想定する場合、プログラムは、 strstr() の 2 番目の引数の複数のスペースを 1 つのスペースに変更します。main() を使用して修正したコードを次に示します。末尾にない空白を削除したい場合は、問題を展開するか、以下の元の回答のリンクから借りると、デバッガーに戻る可能性があります。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

/*
 * attrvalue(): parse an attribute value pair.
 *
 * takes a string of the form "ATTRIBUTE = VALUE" and returns the atrribute name
 * and value as seperate strings
 *
 */
  int
 attrvalue(char *entry, char **attr, char **value)
 {
    char           *copy;
    char           *p;

    if (!entry || *entry == '\0')
            return 1;

    copy = strdup(entry);

    *attr = strtok(copy, "=");
    *value = strtok(NULL, "\n");

    /* strip trailing whitespace from attr and value */
    p = strstr(*attr, " ");
    if(p)
      *p = '\0';
    p = strstr(*value, " ");
    if(p)
      *p = '\0';
    return (0);
}

int main()
{
    char *input = "asdf    =blah ";  // this works
    //char *input = " asdf = blah";  // this would not
    char *attr;
    char *value;

    attrvalue(input, &attr, &value);

    printf("attr =\"%s\"", attr);
    printf("value=\"%s\"", value);

    return 0;
}

元の回答: この状況で strstr() がどのように機能するかが明確ではないため、空白を取り除く別の方法を使用します。ここにstrstr() のドキュメントがあります。ここに、 C での空白の削除について説明している SO トピックがあります

他の考えをいくつか:

  • if(p)ニットとして、ある必要がありますif(p != NULL)
  • strstr() の 2 番目の引数が最初の引数よりも長い場合はどうなりますか?
于 2013-02-10T20:53:57.627 に答える