每一个可以努力的日子,都是一份厚礼。
C/C++反序输出字符串总结
2011-03-21 22:31
2年前去T公司面试,面试官给了我一张纸一支笔,说写个程序吧,输入一个字符串然后反序输出。我问输入输出是用函数参数呢还是系统I/O,面试官说随你便,写完了说说各有什么优缺点吧。当时我大三,没有参加过ACM没有实验室经历除了课程设计也没写过什么程序,完全小白。当然至今也仍然是菜鸟一只,不堪回首啊。
方法一:据说有库函数strrev()啊
#include
#include
int main(int argc, char* argv[])
{
if (argc != 2)
{
printf("Usage: %s string\n\n", argv[0]);
return -1;
}
char* str = argv[1];
strrev(str);
printf("Reversed string: %s\n", str);
return 0;
}
结果Linux下编译报错,说找不到strrev()这个函数,我勒个去,坑爹呢这是?VS2010编译通过正常运行。好吧,还是自己来写一个吧~
方法二:首尾互换
#include
#include
using namespace std;
char *reverse(char *str)
{
int len = strlen(str);
char *head = str;
char *tail = str + len - 1;
while (head < tail)
{
char tmp = *head;
*head++ = *tail;
*tail-- = tmp;
}
return str;
}
int main(int argc, char* argv[])
{
if (argc != 2)
{
cout << "Usage: " << argv[0] << " string" << endl;
return -1;
}
cout << "Reversed string: " << reverse(argv[1]) << endl;
return 0;
}
终于都通过了啊。就用了个循环把字符串里的字符逐个首尾互换了。啥?性能?有啥问题?没看到每次进循环都要新建变量tmp吗?这这这。。。这也有影响?好吧,把这个声明放到循环外面。还能提升么?去掉字符互换操作!!直接从尾巴倒过来输出不就得了~
方法三:从尾到头
#include
#include
using namespace std;
int main()
{
string str;
cout << "Input: ";
cin >> str;
unsigned int i = str.length();
cout << "Reversed string: ";
while(i != 0)
{
cout << str[i-1];
--i;
}
cout << endl;
return 0;
}
这回用了I/O做输入,并且还能保留原来的字符串不变。嗯,不错不错,其实我们连字符串长度都不需要知道。再写一个~
方法四:递归
#include
using namespace std;
void reverse(char *str)
{
if(*str)
reverse(str+1);
else
return;
cout << *str;
}
int main()
{
char str[1024] = {NULL};
cout << "Input: ";
cin >> str;
reverse(str);
cout << endl;
return 0;
}
估计一般没人会这么写吧。。。
| 这篇文章由lovelucy于2011-03-21 22:31发表在编程。你可以订阅RSS 2.0 也可以发表评论或引用到你的网站。除特殊说明外文章均为本人原创,并遵从署名-非商业性使用-相同方式共享创作协议,转载或使用请注明作者和来源,尊重知识分享。 |

批评不自由
则赞美无意义