繁体   English   中英

c中的小写字符串

[英]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的标准函数,该函数的功能有所不同(将一个字符转换为小写字母)。 考虑到这一点,我建议:

  1. 为您的函数起一个不同的名字,以避免混淆;
  2. 在实现中使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM