2014-11-03 2 views
1

Я работаю над проектом, предназначенным для создания функций для выполнения различных действий, но у меня возникли проблемы с реализацией одной из функций.Почему моя функция символа падает?

int main() 
{ 
    char str1[30] = "Hello"; 
    char str2[30] = "Goodbye old friend"; 
    char str3[30]; 

    char *p = strCopy(str3, "Annie"); 
    printf("(Annie) %s\n", p); 

    p = strString(str3, "nn"); 
    printf("(nnie) %s\n", p); 

    strCopy(str3, "HeloHellooo"); 
    p = strString(str3, "ello"); 
    printf("(ellooo) %s\n", p); 

    return 0; 
} 

char *strCopy(char *s1, const char *s2) 
{ 

    char *b = s1; 

    while (*s2!='\0') 
    { 
     *s1 = *s2; 
     s1++; 
     s2++; 
    }  
    *s1 = '\0'; 

    return b; 

} 


char *strString(const char *s1, const char *s2) // returns a string that starts with the characters in *s2. For example: char *strString ("Annie", "nn") should return "nnie".) 
{ 
    char *test; 
    char *b = test; 
    while (*s1 != '\0' && *s2 != '\0') 
    { 

     if (*s1 == *s2) 
     { 
     *test = *s1; 
     } 
     s1++; 
     s2++; 
    } 

*test = '\0';  
return b; 
} 

У меня возникли проблемы, выяснить, как вернуть значение в полукокса * strString когда целые константы являются только два параметра. Когда я пытаюсь, программа вылетает из строя. Имейте в виду, что параметры, декларации функций и то, что находится внутри main(), должны быть точно такими, какие они написаны. Это код, данный мне как часть проекта. Я могу только манипулировать тем, что входит в функции. Мне также не разрешено использовать массивы в любой из моих функций.

(код внутри * strString, очевидно, не является окончательным. Я просто возник проблемы что-нибудь тестирование, пока я не могу понять, как вернуть значение.)

+0

Параметры 'strString' являются указателями, а не целыми числами. Однако вам нужно будет «отбросить const», чтобы вернуться (если предполагается, что это должно иметь такое же поведение, как функция «strstr»), вам также придется переписать тело функции, чтобы на самом деле произвести предполагаемый указатель. –

ответ

2

Внутри strString используется неинициализированный указатель test :

char *b = test; // oops 

...

*test = *s1;  // oops 

Вы могли бы начать с:

char *test = NULL; 

Тогда вы можете обновить test, когда найдете свою подстроку. На каком этапе вы не хотите писать *test =, потому что вы не изменяете ни одну из входных строк, ни создаете новую строку. Вы должны вернуть указатель, который указывает на s1 в точке, где может быть найдена подстрока.

+0

имеет смысл. Однако, когда я убираю это и пытаюсь вернуть тест, он все равно падает. – Titanguy654

+0

Но 'test' по-прежнему неинициализирован. Вы должны инициализировать его чем-то - что именно это должно быть? – smci

+0

Если 'strString :: test' должен быть буфером для копии s1, или что-то подобное, вам нужно выполнить malloc() перед тем, как начать писать в * test. – smci

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