строчная строка в с - PullRequest
1 голос
/ 16 мая 2011

У меня было несколько строк здесь:

#include <stdio.h>

char *tolower(char *data)
{
    char *p = data;
    while(*p)
    {
        printf("nilai p : %c\n",*p);
            if(*p >= 'A' && *p <= 'Z')
            {
                *p += ('a' - 'A');
            }
        p++;
    }
    return p;

}

int main()
{

    char *a = "HajAR BleH";
    char *b = tolower(a);

    printf("nilai b : %s\n",b);
    printf("nilai a - A : %d\n",'a' - 'A');
return 0;
}

следующий, скомпилированный, запущенный на GDB и отслеженный сегментации

xxx@aaa:/tmp$ gcc -o aa aa.c --debug
xxx@aaa:/tmp$ gdb -q aa
Reading symbols from /tmp/aa...done.
(gdb) r
Starting program: /tmp/aa 
nilai p : H

Program received signal SIGSEGV, Segmentation fault.
0x0804841e in tolower (data=0x804855e "HajAR BleH") at aa.c:11
11                  *p += ('a' - 'A');
(gdb) 

вопрос

1. Я думаю *p += ('a' - 'A'); будет равно 'H' += ('a' - 'A') и равно 72 += 32 но, случайно ошибка сегментации, почему это может быть?

2. зачем добавлять ('a' - 'A'), чтобы char / byte становилось ниже?

пока что все, заранее спасибо

Ответы [ 5 ]

7 голосов
/ 16 мая 2011

Вы пытаетесь изменить строковый литерал.Измените:

char *a = "HajAR BleH";

на:

char a[] = "HajAR BleH";

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

4 голосов
/ 16 мая 2011

Наиболее вероятной причиной SEGV является то, что компилятор поместил a в постоянную память, как это разрешено делать со строковыми литералами.

Попробуйте изменить определение a на:

char a[] = "HajAR BleH";

Что касается стиля, то уже существует стандартная функция с именем tolower, которая делает что-то другое (конвертирует один символ в нижний регистр). Имея это в виду, я бы предложил:

  1. давая вашей функции другое имя, чтобы избежать путаницы;
  2. с использованием tolower в вашей реализации для преобразования одного символа в нижний регистр.
2 голосов
/ 16 мая 2011

Причина ошибки seg заключается в том, что вы пытаетесь изменить строковый литерал, который находится в постоянной памяти, что приводит к неопределенному поведению.

Попробуйте изменить

char *a = "HajAR BleH";

на

char a[] = "HajAR BleH";
0 голосов
/ 16 мая 2011

1: По сути, ваш код верен, однако вы пытаетесь изменить постоянную строку (char *a следует изменить const char *a). Вам нужно будет создать еще один массив символов, который вы сможете изменить.

2: ('a' - 'A') вычисляет «разницу» в значениях ascii между символами нижнего и верхнего регистра (32).

0 голосов
/ 16 мая 2011

Помимо проблемы с постоянной памятью, вам необходимо вернуть data вместо p.К тому времени, когда ваш цикл завершится, p будет указывать на нулевой терминатор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...