c中的小写字符串

时间:2011-05-16 10:27:33

标签: c string lowercase

我在这里有几行:

#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 个答案:

答案 0 :(得分:7)

您正在尝试修改字符串文字。变化:

char *a = "HajAR BleH";

为:

char a[] = "HajAR BleH";

此外,还有一个名为tolower()的标准库函数,实际上您应该在代码中使用它。将自己的功能称为其他功能。

答案 1 :(得分:4)

SEGV的最可能原因是编译器已将a放在只读内存中,因为它允许使用字符串文字。

尝试将a的定义更改为:

char a[] = "HajAR BleH";

作为一种风格,已经存在一个名为tolower的标准函数,它执行不同的操作(将一个字符转换为小写)。考虑到这一点,我建议:

  1. 为您的职能提供不同的名称以避免混淆;
  2. 在您的实现中使用tolower将一个字符转换为小写。

答案 2 :(得分:2)

seg-fault的原因是你试图修改一个字符串文字,它位于只读内存中,导致未定义的行为。

尝试更改

char *a = "HajAR BleH";

char a[] = "HajAR BleH";

答案 3 :(得分:0)

除了只读内存的问题外,还需要返回data而不是p。当你的循环结束时,p指向空终止符。

答案 4 :(得分:0)

1:基本上你的代码是正确的,但是你试图修改一个常量字符串(char *a应该reda const char *a)。你必须创建另一个你能够修改的字符数组。

2:('a' - 'A')计算小写字符和大写字符之间ascii值的“差异”(32)。