好久沒寫部落格了 ,一是懶,二是沒什麼可寫,或者說最近真正看書的時間不多,時間也是花了的,都搞飛思卡爾了,不過調車這個東西,很耗時間的,但也確實有趣。
今天在同學那看到了KR的《The C Programming Language》,說來慚愧,一時說自己是搞軟體的,但卻沒有看完這本最最經典的著作。
直接翻到第7章輸入與輸出,做第一個練習題7-1,題目是編寫一個程式,根據它自身被調用時存放在argv[0]中的名字,實現將大寫字母轉換為小寫字母或將小寫字母轉換為大寫字母的功能。
程式很easy,實現如下(平台ubuntu)
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(int argc, char **argv)
{
int (*convcase[2])(int) = {toupper, tolower};
int func;
int result = EXIT_SUCCESS;
int ch;
if(argc > 0)
{
if(toupper((unsigned char)argv[0][0]) == 'U')
{
func = 0;
}
else
{
func = 1;
}
while((ch = getchar()) != EOF)
{
ch = (*convcase[func])((unsigned char)ch);
putchar(ch);
}
}
else
{
fprintf(stderr, "Unknown name. Can't decide what to do./n");
result = EXIT_FAILURE;
}
return result;
}
如果程式名第一個字母是u或U則為小寫轉大寫,否則為大寫轉小寫。
測試如下:
輸入panghui,輸出依舊是panghui,悲劇了。。。
。。。
。。。
一時間還真不知道錯哪了,過程不說了,糾結了很久,也許高手一下就看出來了吧。
寫個程式程式看看。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
int i;
printf("test main parameter/n");
printf("argc:%d/n", argc);
for(i=0;i<argc;i++)
{
printf("argv[%d]:%s/n", i, argv[i]);
}
exit(0);
}
好了,問題很明顯了,這個當時還真沒想到,我以為./在Linux下無非是說明程式在目前的目錄中尋找而已,結果不是的哦,找到了問題,修改就很簡單了,直接是argv[0][2]就可以了。
結果如下:
---------------------------------------------------------------------------------- 轉載我部落格文章鄭重聲明:技術性網站著名原創作者即可轉載,商業性網站必須經過我的同意才能轉載,否則追究責任——
pang123hui的部落格:
部落格園http://www.cnblogs.com/pang123hui/
CSDNhttp://blog.csdn.net/pang123hui/