zoukankan      html  css  js  c++  java
  • C/C++反序输出字符串总结

    2年前去T公司面试,面试官给了我一张纸一支笔,说写个程序吧,输入一个字符串然后反序输出。我问输入输出是用函数参数呢还是系统I/O,面试官说随你便,写完了说说各有什么优缺点吧。当时我大三,没有参加过ACM没有实验室经历除了课程设计也没写过什么程序,完全小白。当然至今也仍然是菜鸟一只,不堪回首啊。

    方法一:据说有库函数strrev()啊

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    #include <stdio.h>
    #include <string.h>
    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编译通过正常运行。好吧,还是自己来写一个吧~

    方法二:首尾互换

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    
    #include <iostream>
    #include <cstring>
    using namespace std; 
     
    char *reverse(char *str)
    {
    	int len = strlen(str);
    	char *head = str;
    	char *tail = str + len - 1;
    	while (head &lt; 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吗?这这这。。。这也有影响?好吧,把这个声明放到循环外面。还能提升么?去掉字符互换操作!!直接从尾巴倒过来输出不就得了~

    方法三:从尾到头

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    #include <iostream>
    #include <string>
    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做输入,并且还能保留原来的字符串不变。嗯,不错不错,其实我们连字符串长度都不需要知道。再写一个~

    方法四:递归

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    #include <iostream>
    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;
    }

    估计一般没人会这么写吧。。。

  • 相关阅读:
    26种激发人创造力的天使商标设计
    TopFreeTheme精选免费模板【20130703】
    解决插入到MySql数据库中乱码问题
    商务名片创意搜罗
    10个优质PSD文件资源下载
    TopFreeTheme精选免费模板【20130701.特别版】
    【原创】关于java对象需要重写equals方法,hashcode方法,toString方法 ,compareto()方法的说明
    谨慎使用keySet:对于HashMap的2种遍历方式比较
    有关google的guava工具包详细说明
    java消除 list重复值及交集,并集,差集
  • 原文地址:https://www.cnblogs.com/bluestorm/p/2298175.html
Copyright © 2011-2022 走看看