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