※ 引述《gash55025502 (白影弓)》之銘言:
: 聽說八卦版們各方面的神人們都很多
: 想必一定也有精通C語言的人
原來八卦板可以拿來討論 C 語言程式設計,太好了。
: 就是阿
支持文言文,這裡幫你改為「嗟夫」
: 輸入一個字串要將他做大小寫轉換
: 轉換是轉換成功了
: 但是後面卻跑出一堆亂碼
: 可以請大神們幫我看看問題出在哪嗎
為了避免變成暑修作業 (?),我提供一份實作,讓你想想,歡迎討論。
檔名: X.c
===從這裡開始===
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
/* Reference:
* http://www.geeksforgeeks.org/ \
* case-conversion-lower-upper-vice-versa-string-using-bitwise-operators-cc/
*/
static const int ascii_x = 32;
/* Lower to Upper Case; Upper to Lower Case */
static inline char *case_swap(char *in) {
for (int i = 0; in[i] != '\0'; i++)
if (isalpha(in[i]))
in[i] ^= ascii_x;
return in;
}
#define LEN 50
#define str(x) # x
#define xstr(x) str(x)
static char buf[LEN];
int main() {
/* Ensure that there is no buffering for stdin. */
setbuf(stdin, NULL);
/* discard the input stream upto but not including the newline
* character. Extra getchar() is required to consume this.
*/
scanf("%"xstr(LEN)"[^\n]%*[^\n]", buf);
getchar();
/* TODO: error handling such as EOF */
printf("Orig: %s\n", buf);
printf("New: %s\n", case_swap(buf));
return 0;
}
===這裡結束===
以 GNU/Linux 為例,編譯和執行方式如下: (省略開頭的 '$ ')
$ gcc -o X X.c -Wall
$ ./X
參考輸入: abcde (記得按下 Enter)
參考輸出:
Orig: abcde
New: ABCDE
可隨機產生字串來測試程式,方法如下: (省略開頭的 '$ ')
$ (cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 10 | head -n 1) | ./X
參考輸出:
Orig: MeXKS1VMOi
New: mExks1vmoI
上述程式仍有改進空間,隨意列出:
1. 缺乏對於 EOF 的處理;
2. 程式碼忽略超出 50 個字元 (正確來說還要減去 NULL terminator) 的處理,但可能會跟使用者期望有落差;
3. 考慮到 secure coding (安全可靠的程式設計方式),應該重新包裝 buffered I/O 函式,讓日後重用;
歡迎一起學習 C 語言程式設計: http://hackfoldr.org/dykc/
「會 C、會呼吸」即可「成為電腦的主人」,做自己,好自在。