簡體   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