Contents
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;
}