[英]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.