我在这里有几行:
#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
降低?
现在一切都好了,先谢谢
答案 0 :(得分:7)
您正在尝试修改字符串文字。变化:
char *a = "HajAR BleH";
为:
char a[] = "HajAR BleH";
此外,还有一个名为tolower()的标准库函数,实际上您应该在代码中使用它。将自己的功能称为其他功能。
答案 1 :(得分:4)
SEGV
的最可能原因是编译器已将a
放在只读内存中,因为它允许使用字符串文字。
尝试将a
的定义更改为:
char a[] = "HajAR BleH";
作为一种风格,已经存在一个名为tolower
的标准函数,它执行不同的操作(将一个字符转换为小写)。考虑到这一点,我建议:
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)。