[英]lower case string in c
我在这里有几行:
#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
变小?
多数民众赞成在现在,在此先感谢
您正在尝试修改字符串文字。 更改:
char *a = "HajAR BleH";
至:
char a[] = "HajAR BleH";
另外,已经有一个名为tolower()的标准库函数,实际上您应该在代码中使用它。 调用其他函数。
在最有可能的原因SEGV
是编译器已经放在a
只读存储器,因为它允许用字符串文字做。
尝试改变a
的定义:
char a[] = "HajAR BleH";
就样式而言,已经存在一个称为tolower
的标准函数,该函数的功能有所不同(将一个字符转换为小写字母)。 考虑到这一点,我建议:
tolower
将一个字符转换为小写。 seg-fault的原因是您试图修改驻留在只读存储器中的字符串文字,从而导致未定义的行为。
尝试改变
char *a = "HajAR BleH";
至
char a[] = "HajAR BleH";
以及只读存储器的问题,您需要返回data
而不是p
。 在循环结束时, p
指向空终止符。
1:从本质上来说,您的代码是正确的,但是您尝试修改常量字符串( char *a
应该reda const char *a
)。 您必须创建另一个可以修改的字符数组。
2 :( ('a' - 'A')
计算小写字符和大写字符之间的ascii值中的“差异”(32)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.