C, проблема с присвоением значения через указатель в функции

Хорошо, поэтому я написал небольшую функцию для преобразования любых заглавных букв в строке в нижний регистр просто для упражнения из книги, по которой я изучаю C.

Все работает нормально, за исключением присвоения значения символу с помощью указателя.
Вот код, и все компилируется правильно, но я получаю эту ошибку времени выполнения "Неизвестная версия протокола псевдоперемещения %d". вот почему я пытаюсь напечатать символ, значение которого изменилось с помощью указателя.

#include <stdlib.h>
#include <stdio.h>
/*
----------------------------------------------
    CONVERTS UPPERCASE CHARACTERS TO LOWERCASE
----------------------------------------------
*/
 void lowercase(char * address, char text2){
    // used in the for loop
    int inc;
    // used as an index for text2Copy
    int inctwo = 0;
    // used in the for loop
    int length = strlen(text2);
    //used to copy the active character in text2
    char  text2Copy[length];

    for(inc = 0; inc <= length; inc++){
        //basicaly if character is a capital leter
        if(text2[inc] >= 'A' && text2[inc] <= 'Z'){
            //I plus 32 because each letter is 32 numbers away in 'ASCII'
            //therefore converting capital to lowercase
            text2Copy[inctwo] = text2[inc] + 32;
            //add one to help with indexing
            inctwo++;
        }
        //if the character is not a capital leter
        else{
            text2Copy[inctwo] = text2[inc];
            inctwo++;
        }
    }

    //*address = "sdafsdf"; //<-- THIS WORKS!!!
    *address = text2Copy;//WHY DOESN"T THIS WORK?
}

int main(){
    //just the string I will be using.
    char * text = "'CONVERT capitals TO lower CASE'";
    //print the string to show the original
    printf("%s\n",text);

    lowercase(&text,text);

    //This is where I want the value from the function to print out
    printf("%s\n",text);

    return 0;
}

Если бы вы могли мне помочь, я был бы вам очень признателен. Я действительно смущен и немного раздражен тем, почему это не сработает. если вам нужно, чтобы я объяснил это лучше, просто попросите об этом. Надеюсь, я уже сделал достаточно.

Спасибо, Джейк.

////////////////////////////////////////////////// ////редактировать///////////////////////////////////////////// /////////////
Хорошо, я воспользовался всеми вашими предложениями, спасибо :D
и теперь это работает, за исключением странной ошибки, которую я не знаю, как исправить. .
все, кроме первого символа, преобразуется в символ нижнего регистра.
что теперь происходит -> "+преобразовать заглавные буквы в нижний регистр" Я не знаю, почему первый символ делает это? Есть предположения?

Вот новый код.

#include <stdlib.h>
#include <stdio.h>
/*
----------------------------------------------
    CONVERTS UPPERCASE CHARACTERS TO LOWERCASE
----------------------------------------------
*/
void lowercase(char * address, char text2[]){
    // used in the for loop
    int inc;
    // used in the for loop
    int length = strlen(text2);

    for(inc = 0; inc <= length; inc++){
        //basicaly if character is a capital leter
        if(text2[inc] >= 'A' && text2[inc] <= 'Z'){
            //I plus 32 because each letter is 32 numbers away in 'ASCII'
            //therefore converting capital to lowercase
            text2[inc] += 32;
            //add one to help with indexing
            inctwo++;
        }
        //if the character is not a capital leter
        else{
            inctwo++;
        }
    }


    *address = text2;
}

int main(){
    //just the string I will be using.
    char text[] = "cONVERT capitals TO lower CASE";
    //print the string to show the original
    printf("%s\n",text);

    lowercase(&text,text);

    //This is where I want the value from the function to print out
    printf("%s\n",text);

    return 0;
}

person user2509366    schedule 22.06.2013    source источник
comment
Вы пытаетесь изменить строковый литерал, что является неопределенным поведением и часто вызывает segfault, поскольку строковые литералы (часто) хранятся в памяти, доступной только для чтения. Это дубликат, дайте мне поискать.   -  person Daniel Fischer    schedule 22.06.2013
comment
возможный дубликат запретов в строковых литералах в C   -  person Daniel Fischer    schedule 22.06.2013
comment
ааа, хорошо, спасибо :D есть ли способ поместить его в память для чтения/записи?   -  person user2509366    schedule 22.06.2013
comment
Я думаю, вы можете создать динамическую строку во время выполнения char text2Copy[length];. Измените это на char text2Copy[20]; просто для тестирования и посмотрите, что вы получите?   -  person Hammad Khan    schedule 22.06.2013
comment
И исправление char text[] = "'CONVERT capitals TO lower CASE'"; состоит в том, чтобы сделать его массивом, чтобы вы могли изменять содержимое.   -  person Daniel Fischer    schedule 22.06.2013
comment
2 параметра в нижнем регистре func избыточны. Просто пройдите мимо реф и все будет хорошо.   -  person Bob Blogge    schedule 22.06.2013
comment
Спасибо :D исправил   -  person user2509366    schedule 22.06.2013


Ответы (1)


У вас несколько проблем. Во-первых, ваша программа не должна даже компилироваться, поскольку вы передаете неправильные типы в свою функцию. Во-вторых, вы пытаетесь изменить буквальную (и, следовательно, постоянную) строку.

Для второй части вы могли бы решить это очень легко, используя вместо этого массив:

char text[] = "CONVERT capitals TO lower CASE";

Вы также пытаетесь «вернуть» указатель на локальную переменную, и это приведет к неопределенному поведению, поскольку локальные переменные, ну, локальные. Как только функция возвращает память, которую она занимала, она будет повторно использоваться другими функциями.

Что касается фактической функции преобразования, ее можно сделать намного проще, чем ваша попытка:

void lowercase(char *text)
{
    while (*text != '\0')
        *text = tolower(*text);
}
person Some programmer dude    schedule 22.06.2013
comment
Предполагается, что часть преобразования переписывает 'tolower()', и поэтому я ее не использовал. но также хорошо, я исправил проблемы с вашим предложением, но строка все еще не меняется. - person user2509366; 22.06.2013
comment
@ user2509366: Вы изменили char* text на char text[]? - person The Mask; 22.06.2013
comment
«Вы также пытаетесь вернуть указатель на локальную переменную, и это приведет к неопределенному поведению, поскольку локальные переменные, ну, локальные. Как только функция вернет память, которую она занимала, она будет повторно использована другими функциями». но я объявил массив символов в main(), поэтому массив символов не будет повторно использоваться в памяти до конца программы, верно? вот почему я передал адрес «текста» в функцию. - person user2509366; 22.06.2013
comment
@user2509366 Если вы используете алфавит ASCII (который сегодня используют почти все компьютеры), вы можете заметить некоторую закономерность. между строчными и прописными буквами. Преобразование из прописной буквы в строчную является простым дополнением. Вы можете использовать простой оператор if, чтобы проверить, является ли символ заглавной буквой, и выполнять сложение только в том случае, если это заглавная буква. - person Some programmer dude; 22.06.2013
comment
@ user2509366 Но переменная text2Copy является локальной в функции преобразования. И вы хотите вернуть указатель на это. - person Some programmer dude; 22.06.2013
comment
Я подумал *address = text2Copy; фактически изменил переменную, на которую указывает *address, на text2Copy. извините, может быть, я просто отсталый и не понимаю этого правильно, я все еще новичок - person user2509366; 22.06.2013