好久没写博客了 ,一是懒,二是没什么可写,或者说最近真正看书的时间不多,时间也是花了的,都搞飞思卡尔了,不过调车这个东西,很耗时间的,但也确实有趣。
今天在同学那看到了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的博客: