C++ Primer: Chapter 6 Function

Note

6.2.5 Main函数处理命令行参数

可以在命令行提示符下输入下面的命令:

wc.exe report1.txt report2.txt report3.txt

其中,wc.exe是程序的可执行文件名,report1.txt、report2.txt 和 report3.txt 是作为命令行参数传递给程序的文件名

cpp有一种让在命令行环境中运行的程序能够访问命令行参数的机制,方法是使用下面带参数的 main() 函数:

int main(int argc, char *argv[])

argc为命令行中的参数个数,其中包括可执行文件本身。argv变量为一个指针,它指向一个指向 char 的指针。这过于抽象,但可以将 argv 看作一个指针数组,其中的指针指向命令行参数,argv[0]是一个指针,指向存储第一个命令行参数的字符串的第一个字符,依此类推。

在上例中,argc为4,argv[0]为wc.exe,argv[1]为report1.txt,依此类推。

案例6.25:把命令行传入的实参字符串拼接成一个字符串

在main.cpp中:

#include<iostream>
#include<string>
using namespace std;

//把命令行传入的所有参数拼接成一个字符串
int main(int argc, char *argv[])
{
	//如果argc == 1,则命令行只有一个可执行文件名,后面没有任何参数
	if (argc == 1)
	{
		cerr << "No parameter" << endl;
		return 0;
	}
		
	string str = "";
	for (int i = 1; i < argc; ++i) //遍历.exe后面的所有参数
	{
		str += string(argv[i]);
	}

	cout << str << endl;

	return 0;
} 

在命令行中:

>cl main.cpp
>main.exe para1 para2 para3

输出内容:

para1para2para3

在这里插入图片描述

案例6.26:输出传递给main实参的内容

在main.cpp中:

#include<iostream>
#include<string>
using namespace std;

//输出传递给main实参的内容
int main(int argc, char *argv[])
{
	//如果argc == 1,则命令行只有一个可执行文件名,后面没有任何参数
	if (argc == 1)
	{
		cerr << "No parameter" << endl;
		return 0;
	}
		
	for (int i = 1; i < argc; ++i) //遍历.exe后面的所有参数
		cout << argv[i] << endl;

	return 0;
} 

在命令行中:

>cl main.cpp
>main.exe -d -o ofile data0

输出内容:

-d
-o
ofile
data0

在这里插入图片描述

6.5.3 NDEBUG

#define NDEBUG //如果不添加,则会输出"未定义NDEBUG"

int main()
{
#ifndef NDEBUG
	cerr << "未定义NDEBUG" << endl;
#endif
	cout << "正常输出的语句" << endl;

	return 0;
}

Homework

Test 6.4

int fact()
{
	int ival = 0;

	cout << "输入一个整数:" << endl;
	cin >> ival;

	int ifact = 1;

	while (ival > 0)
		ifact *= ival--;

	return ifact;
}

int main()
{
	
	int t = fact();

	cout << t << endl;

	return 0;
}

Test 6.5

double myabs(double _dval)
{
	if (_dval >= 0)
		return _dval;
	else
		return -_dval;
}

int main()
{
	double dval = -3.14;
	double absval = myabs(dval);


	cout << absval << endl;

	return 0;
}

Test 6.7

double self_increasing()
{
	static int ival = 0;
	return ival++;
}

int main()
{
	for (int i = 0; i < 10; ++i)
		cout << self_increasing() << endl;

	return 0;
}

Test 6.8-6.9

在fact.cpp中:

#include<iostream>
using namespace std;

int fact()
{
	int ival = 0;

	cout << "输入一个整数:" << endl;
	cin >> ival;

	int ifact = 1;

	while (ival > 0)
		ifact *= ival--;

	return ifact;
}

在Chapter6.h中:

//声明
int fact();

在main.cpp中:

#include<iostream>
#include"Chapter6.h"
using namespace std;


int main()
{
	int ires = fact();
	cout << ires << endl;

	return 0;
}

在命令行中:

>cl fact.cpp main.cpp
>main.exe

Test 6.10

//交换两个指针所指内容
void swap(int* ia, int* ib)
{
	int temp = *ib;
	*ib = *ia;
	*ia = temp;
}

int main()
{
	int a = 1, b = 2;

	swap(&a, &b);

	cout << "a = " << a << " b = " << b << endl;

	return 0;
}

Test 6.12

void swap(int& ia, int& ib)
{
	int temp = ib;
	ib = ia;
	ia = temp;
}

int main()
{
	int a = 1, b = 2;

	swap(a, b);

	cout << "a = " << a << " b = " << b << endl;

	return 0;
}

Test 6.17

//check upper word
void check_upper(const string &_str)
{
	bool isUpper = false;
	for (auto s : _str)
	{
		if (isupper(s))
		{
			cout << "include upper" << endl;
			isUpper = true;
			break;
		}
	}

	if (!isUpper)
		cout << "uninclude upper" << endl;
}

//change upper to lower
void to_lower(string& _str)
{
	for (auto &s : _str)
	{
		if (isupper(s))
		{
			s = tolower(s);
		}
	}
	
	cout << _str << endl;
}

int main()
{
	string str1 = "hello world!", str2 = "HEllO WorLD";

	check_upper(str1);
	to_lower(str2);

	return 0;
}

Test 6.21

//compare two int
int compare(int ival, const int * ipointer)
{
	if (ival > *ipointer)
		return ival;
	else
		return *ipointer;
}


int main()
{
	int ival = 1, ival2 = 2;
	int* ip = &ival2;

	int res = compare(ival, ip);
	cout << "较大的是:" << res << endl;

	return 0;
}

Test 6.22

//swap two pointer
void swap(int * _ip1, int * _ip2)
{
	int temp = *_ip1;
	*_ip1 = *_ip2;
	*_ip2 = temp;
}


int main()
{
	int ival = 1, ival2 = 2;
	int* ip1 = &ival, * ip2 = &ival2;

	swap(ip1, ip2);
	cout << "ip1 point to " << *ip1 << " ip2 point to " << *ip2 << endl;

	return 0;
}

Test 6.25

在main.cpp中:

#include<iostream>
#include<string>
using namespace std;

//把命令行传入的所有参数拼接成一个字符串
int main(int argc, char *argv[])
{
	//如果argc == 1,则命令行只有一个可执行文件名,后面没有任何参数
	if (argc == 1)
	{
		cerr << "No parameter" << endl;
		return 0;
	}
		
	string str = "";
	for (int i = 1; i < argc; ++i) //遍历.exe后面的所有参数
	{
		str += string(argv[i]);
	}

	cout << str << endl;

	return 0;
} 

在命令行中:

>cl main.cpp
>main.exe para1 para2 para3

输出内容:

para1para2para3

Test 6.26

在main.cpp中:

#include<iostream>
#include<string>
using namespace std;

//输出传递给main实参的内容
int main(int argc, char *argv[])
{
	//如果argc == 1,则命令行只有一个可执行文件名,后面没有任何参数
	if (argc == 1)
	{
		cerr << "No parameter" << endl;
		return 0;
	}
		
	for (int i = 1; i < argc; ++i) //遍历.exe后面的所有参数
		cout << argv[i] << endl;

	return 0;
} 

在命令行中:

>cl main.cpp
>main.exe -d -o ofile data0

输出内容:

-d
-o
ofile
data0

Test 6.27

int sumlist(initializer_list<int> li)
{
	int sum = 0;
	for (auto pi = li.begin(); pi != li.end(); ++pi)
	{
		sum += *pi;
	}

	return sum;
}

int main()
{
	initializer_list<int> li_1 = { 1, 2, 3, 4, 5 };
	initializer_list<int> li_2 = { 7, 8, 9};

	cout << sumlist(li_1) << endl;
	cout << sumlist(li_2) << endl;
	return 0;
} 

Test 6.30

bool str_subrange(const string& str1, const string& str2)
{
	if (str1.size() == str2.size())
		return str1 == str2;
	auto size = (str1.size() < str2.size()) ? str1.size() : str2.size();

	for (decltype(size) i = 0; i != size; ++i)
	{
		if (str1[i] != str2[i])
			return;
	}
}

int main(void)
{
	return 0;
}

错误 C2561 “str_subrange”: 函数必须返回值

Test 6.33

void printvector(vector<int> ivec, size_t index = 0)
{
	if (index < ivec.size())
	{
		cout << ivec[index] << endl;
		printvector(ivec, index + 1);
	}
	
}

int main()
{
	vector<int> v = { 1, 2, 3, 4, 5 };

	printvector(v, 0);

	return 0;
}

Test 6.34

string make_plural(size_t ctr, const string& word, const string& ending = "s")
{
	return (ctr > 1) ? word + ending : word;
}

int main()
{
	string word = "lab";
	cout << make_plural(2, word) << endl;

	return 0;
}

Test 6.44

inline bool isShorter(const string& s1, const string& s2)
{
	return s1.size() < s2.size();
}

int main()
{
	string s1 = "hello world!" , s2 = "hello world";

	cout << ((isShorter(s1, s2)) ? s1 : s2) << " is shorter" << endl;

	return 0;
}

Test 6.47

#include<iostream>
#include<string>
#include<vector>
using namespace std;
//#define NDEBUG //关闭调试器

void printvector(vector<int> ivec, size_t index = 0)
{
#ifndef NDEBUG
	cout << "current index is : " << index << endl;
#endif
	if (index < ivec.size())
	{
		cout << ivec[index] << endl;
		printvector(ivec, index + 1);
	}

}

int main()
{
	vector<int> v = { 1, 2, 3, 4, 5 };

	printvector(v);

	return 0;
}

Test 6.54

int func(int, int);

int main()
{
	vector<decltype(func) *> v = {func};
	return 0;
}

Test 6.55 - 6.56

int func(int, int);

int my_add(int a, int b)
{
	return a + b;
}

int my_subtract(int a, int b)
{
	return a - b;
}

int my_multiply(int a, int b)
{
	return a * b;
}

int my_divide(int a, int b)
{
	return a / b;
}

int main()
{
	//save in vector
	vector<decltype(func) *> vect = {my_add, my_subtract, my_multiply, my_divide};
	
	//call function in pointer vector 
	int a = 1, b = 2;

	for (auto v : vect)
	{
		cout << (*v)(a, b) << endl;
	}

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值