※ 引述《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、会呼吸”即可“成为电脑的主人”,做自己,好自在。