2013-02-10 2 views
2

Я написал небольшую программу на Mac OS X, но я получаю следующее сообщение об ошибке в следующей функции:Ошибка: KERN_INVALID_ADDRESS по адресу: 0x0000000000000000 0x00007fff99b359c4 в strstr()

Program received signal EXC_BAD_ACCESS, Could not access memory. Reason: KERN_INVALID_ADDRESS at 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); 
} 

Любая идея, что неправильно с этой функцией здесь?

Спасибо.

+0

В отладчике вы должны проверить значение '* attr' и' * value'. Я привык к консоли GDB - в консоли вы можете ввести команду 'up' до тех пор, пока вы не окажетесь в правильном стеке стека (фрейм для' attrvalue', а не 'strstr'), затем введите' p * value' или 'p * attr', чтобы увидеть значение, переданное' strstr() ', и посмотреть, является ли это значение' NULL'. Я уверен, что есть также способ сделать это через графический интерфейс. –

+0

Спасибо Дитриху, это очень полезно. – user2059593

+0

Да, если вы хотите больше всего учиться, отстрел отладчика, вероятно, лучше, чем мой ответ. :) –

ответ

0

Исправленный ответ: Если вы считаете, что в начале или в attr или значении нет пробелов (т. Е. Между началом строки и строкой attr нет пробела или знака равенства и строки значения), то ваша программа может работать только с небольшой корректировкой: измените несколько пробелов во втором аргументе strstr() на одиночные пробелы. Далее следует пересмотренный код с основным() для демонстрации. Если вы хотите разделить безымянные пробелы, то, скорее всего, это вернет обратно к отладчику, поскольку вы расширяете проблему или заимствуете из ссылки в моем первоначальном ответе ниже.

#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() documentation, и вот SO topic discussing the removal of whitespace in C.

Пара другие мысли:

  • if(p) должен быть if(p != NULL), как нит.
  • Что делать, если второй аргумент strstr() длиннее первого?
+0

Отлично, спасибо за помощь и быстрый ответ. – user2059593

+0

Привет, Дэвид, должен ли я отправить полный код, чтобы вы могли взглянуть? – user2059593

+0

Я бы предложил отредактировать исходное сообщение, чтобы добавить то, что вы попробовали дальше, и определить наиболее конкретные проблемы (проблемы), которые вы можете назвать сейчас. –

Смежные вопросы