Re: [問卦] C程式大神們請進消失
※ 引述《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、會呼吸」即可「成為電腦的主人」,做自己,好自在。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.133.113.20
※ 文章網址: https://www.ptt.cc/bbs/Gossiping/M.1503848808.A.A6A.html
推
08/27 23:47, , 1F
08/27 23:47, 1F
→
08/27 23:47, , 2F
08/27 23:47, 2F
推
08/27 23:47, , 3F
08/27 23:47, 3F
噓
08/27 23:47, , 4F
08/27 23:47, 4F
推
08/27 23:48, , 5F
08/27 23:48, 5F
→
08/27 23:48, , 6F
08/27 23:48, 6F
推
08/27 23:48, , 7F
08/27 23:48, 7F
→
08/27 23:48, , 8F
08/27 23:48, 8F
推
08/27 23:48, , 9F
08/27 23:48, 9F
→
08/27 23:48, , 10F
08/27 23:48, 10F
推
08/27 23:49, , 11F
08/27 23:49, 11F
→
08/27 23:49, , 12F
08/27 23:49, 12F
推
08/27 23:49, , 13F
08/27 23:49, 13F
推
08/27 23:49, , 14F
08/27 23:49, 14F
推
08/27 23:49, , 15F
08/27 23:49, 15F
→
08/27 23:50, , 16F
08/27 23:50, 16F
噓
08/27 23:50, , 17F
08/27 23:50, 17F
推
08/27 23:50, , 18F
08/27 23:50, 18F
推
08/27 23:50, , 19F
08/27 23:50, 19F
→
08/27 23:51, , 20F
08/27 23:51, 20F
→
08/27 23:51, , 21F
08/27 23:51, 21F
推
08/27 23:52, , 22F
08/27 23:52, 22F
推
08/27 23:52, , 23F
08/27 23:52, 23F
噓
08/27 23:52, , 24F
08/27 23:52, 24F
推
08/27 23:53, , 25F
08/27 23:53, 25F
噓
08/27 23:53, , 26F
08/27 23:53, 26F
推
08/27 23:54, , 27F
08/27 23:54, 27F
→
08/27 23:54, , 28F
08/27 23:54, 28F
推
08/27 23:54, , 29F
08/27 23:54, 29F
推
08/27 23:55, , 30F
08/27 23:55, 30F
推
08/27 23:56, , 31F
08/27 23:56, 31F
推
08/27 23:56, , 32F
08/27 23:56, 32F
推
08/27 23:56, , 33F
08/27 23:56, 33F
推
08/27 23:58, , 34F
08/27 23:58, 34F
推
08/27 23:58, , 35F
08/27 23:58, 35F
推
08/27 23:59, , 36F
08/27 23:59, 36F
推
08/27 23:59, , 37F
08/27 23:59, 37F
推
08/28 00:00, , 38F
08/28 00:00, 38F
推
08/28 00:00, , 39F
08/28 00:00, 39F
還有 325 則推文
→
08/28 18:50, , 365F
08/28 18:50, 365F
推
08/28 19:01, , 366F
08/28 19:01, 366F
推
08/28 19:11, , 367F
08/28 19:11, 367F
推
08/28 20:23, , 368F
08/28 20:23, 368F
推
08/28 20:27, , 369F
08/28 20:27, 369F
推
08/28 20:36, , 370F
08/28 20:36, 370F
→
08/28 20:37, , 371F
08/28 20:37, 371F
→
08/28 20:37, , 372F
08/28 20:37, 372F
→
08/28 21:01, , 373F
08/28 21:01, 373F
噓
08/28 21:36, , 374F
08/28 21:36, 374F
推
08/28 21:42, , 375F
08/28 21:42, 375F
推
08/28 21:49, , 376F
08/28 21:49, 376F
推
08/29 01:03, , 377F
08/29 01:03, 377F
推
08/29 01:42, , 378F
08/29 01:42, 378F
推
08/29 02:28, , 379F
08/29 02:28, 379F
推
08/29 02:32, , 380F
08/29 02:32, 380F
推
08/29 03:50, , 381F
08/29 03:50, 381F
噓
08/29 04:00, , 382F
08/29 04:00, 382F
推
08/29 04:26, , 383F
08/29 04:26, 383F
推
08/29 06:41, , 384F
08/29 06:41, 384F
推
08/29 09:06, , 385F
08/29 09:06, 385F
→
08/29 09:26, , 386F
08/29 09:26, 386F
→
08/29 09:27, , 387F
08/29 09:27, 387F
推
08/29 09:28, , 388F
08/29 09:28, 388F
→
08/29 09:36, , 389F
08/29 09:36, 389F
→
08/29 09:37, , 390F
08/29 09:37, 390F
推
08/29 09:51, , 391F
08/29 09:51, 391F
推
08/29 14:30, , 392F
08/29 14:30, 392F
推
08/29 14:40, , 393F
08/29 14:40, 393F
推
08/29 19:34, , 394F
08/29 19:34, 394F
→
08/29 19:35, , 395F
08/29 19:35, 395F
推
08/29 21:48, , 396F
08/29 21:48, 396F
推
08/29 23:10, , 397F
08/29 23:10, 397F
推
08/30 03:21, , 398F
08/30 03:21, 398F
推
08/30 10:08, , 399F
08/30 10:08, 399F
推
08/30 11:24, , 400F
08/30 11:24, 400F
推
08/30 11:38, , 401F
08/30 11:38, 401F
推
08/30 22:07, , 402F
08/30 22:07, 402F
推
08/31 00:12, , 403F
08/31 00:12, 403F
推
10/04 00:18, , 404F
10/04 00:18, 404F
討論串 (同標題文章)