在 C 語言中轉換字串為小寫
本文將演示如何在 C 語言中把字串轉換為小寫的多種方法。
C 語言中使用 tolower
函式將字串轉換為小寫
tolower
函式是 C 標準庫的一部分,定義在 <ctype.h>
標頭檔案中。tolower
接受一個 int
型別引數,如果存在相應的小寫表示,則返回給定字元的轉換值。注意,傳遞的字元需要是 EOF 或 unsigned char
型別可表示的。在這種情況下,我們用一個字串字面值初始化 char
指標,然後迭代每個字元,將其轉換為小寫值。不過要注意的是,傳遞給 tolower
函式的 char
型別引數必須被轉換為 unsigned char
。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(){
char *str = "THIS STRING LITERAL IS ARBITRARY";
printf("%s\n", str);
for (size_t i = 0; i < strlen(str); ++i) {
printf("%c", tolower((unsigned char) str[i]));
}
printf("\n");
exit(EXIT_SUCCESS);
}
輸出:
THIS STRING LITERAL IS ARBITRARY
this string literal is arbitrary
前面的例子程式碼用轉換後的小寫字元覆蓋了原始字串的內容。或者,我們可以使用 calloc
分配另一個 char
指標,它與 malloc
類似,只是它將分配的記憶體清零,並單獨儲存轉換後的字串。注意,指標應該在程式退出前釋放,如果程序是長期執行的,則應該在不需要字串變數時立即釋放。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(){
char *str = "THIS STRING LITERAL IS ARBITRARY";
printf("%s\n", str);
size_t len = strlen(str);
char *lower = calloc(len+1, sizeof(char));
for (size_t i = 0; i < len; ++i) {
lower[i] = tolower((unsigned char)str[i]);
}
printf("%s", lower);
free(lower);
exit(EXIT_SUCCESS);
}
輸出:
THIS STRING LITERAL IS ARBITRARY
this string literal is arbitrary
C 語言中使用自定義函式將字串轉換為小寫字母
一個更靈活的解決方案是實現一個自定義函式,將字串變數作為引數,並在一個單獨的記憶體位置返回轉換後的小寫字串。這種方法本質上是將前面的例子與 main
函式解耦。在本例中,我們建立了一個函式 toLower
,它接收 char*
,其中儲存了一個空端字串和一個表示字串長度的 size_t
型別的整數。該函式使用 calloc
函式分配堆上的記憶體;因此,呼叫者負責在程式退出前重新分配記憶體。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
char *toLower(char *str, size_t len)
{
char *str_l = calloc(len+1, sizeof(char));
for (size_t i = 0; i < len; ++i) {
str_l[i] = tolower((unsigned char)str[i]);
}
return str_l;
}
int main(){
char *str = "THIS STRING LITERAL IS ARBITRARY";
printf("%s\n", str);
size_t len = strlen(str);
char *lower = toLower(str, len);
printf("%s", lower);
free(lower);
exit(EXIT_SUCCESS);
}
輸出:
THIS STRING LITERAL IS ARBITRARY
this string literal is arbitrary
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn