Re: [問卦] C程式大神們請進

作者: jserv (松鼠)   2017-08-27 23:46:44
※ 引述《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、會呼吸」即可「成為電腦的主人」,做自己,好自在。
作者: jhjhs33504 ( )   2017-08-27 23:47:00
有神快拜
作者: Refauth (山丘上的長號手)   2017-08-27 23:47:00
......................
作者: eris231 (eris)   2017-08-27 23:47:00
jserv ....
作者: HateAnus (討厭從後面來)   2017-08-27 23:47:00
Jserv 我來噓一下
作者: sky791127 (喔耶GOGO)   2017-08-27 23:48:00
趕快拜神
作者: Refauth (山丘上的長號手)   2017-08-27 23:48:00
又來亂搞了.........
作者: Merkle (你在想奇怪的東西齁)   2017-08-27 23:48:00
有神快拜
作者: asd2260123 (南部大葉文組夜校肥宅)   2017-08-27 23:48:00
><
作者: alan23273850   2017-08-27 23:48:00
大神親自下凡來指導啦!!!!!還免學費,原PO真的要好好珍惜阿!!!!!!!!!!!!!!!!!!
作者: isa (流浪的季節)   2017-08-27 23:49:00
媽~~我看到jserv了!
作者: s860134 (s860134)   2017-08-27 23:49:00
還是去學 python 嘻嘻
作者: deepdish (Keep The Faith)   2017-08-27 23:49:00
朝聖
作者: skyabsence (333)   2017-08-27 23:49:00
這釣竿有點強
作者: Archier (昨日洨篤)   2017-08-27 23:49:00
又在浪費才能了.....
作者: isa (流浪的季節)   2017-08-27 23:50:00
有神快拜!
作者: knowledge56 (知識五六)   2017-08-27 23:50:00
看不懂
作者: franklin1997 (富蘭克林)   2017-08-27 23:50:00
教授?
作者: soga0806 (巴歐薩給路嘎)   2017-08-27 23:50:00
傻眼 你是本人嗎?
作者: s860134 (s860134)   2017-08-27 23:51:00
ID當然是本人阿..
作者: hsnuonly (附中only)   2017-08-27 23:51:00
作者: Morphee (千磨萬擊還堅勁)   2017-08-27 23:52:00
朝聖
作者: deathrow (deadman walking...)   2017-08-27 23:52:00
先拜再說了
作者: Brabus700G (路邊賣檳榔的阿伯)   2017-08-27 23:52:00
c語言是垃圾 java才是王道
作者: kokobom (Jerry)   2017-08-27 23:53:00
有神快拜
作者: DarkIllusion (′・ω・‵)   2017-08-27 23:53:00
是jserv 噓
作者: XXXXSHIT (給我八千元 我給你五顆星)   2017-08-27 23:54:00
看完以後好暈 不是有簡單的寫法?
作者: jserv (松鼠)   2017-08-27 23:54:00
Brabus700G, 對呀,所以趕快來自幹 JVM
作者: newtoeic900 (neko)   2017-08-27 23:54:00
快拜
作者: JJ1622   2017-08-27 23:55:00
有神快拜
作者: ycix (從缺)   2017-08-27 23:56:00
靠杯 是本人 有神快拜
作者: Schnucki (CK)   2017-08-27 23:56:00
拜大神
作者: pig250907 (pig250907)   2017-08-27 23:56:00
快拜

Links booklink

Contact Us: admin [ a t ] ucptt.com