12.编写一个程序,读取输入,直至读到 BOF,报告读入的单词数、大写字母数、小写字母数、标点符号数和数字字符数。使用ctype.h头文件中的函数。
cpp
#include <ctype.h>
int main()
{
system("chcp 65001");
char ch;
int word_count = 0;
int upper_count = 0;
int lower_count = 0;
int punct_count = 0;
int digit_count = 0;
char prch = 0;
while ((ch = getchar()) != EOF)
{
if (isalpha(ch))
{
if (isupper(ch))
{
upper_count++;
}
else
{
lower_count++;
}
}
else if (isdigit(ch))
{
digit_count++;
}
else if (ispunct(ch))
{
punct_count++;
if (isalpha(prch))
{
word_count++;
}
}
else if (ch == ' ')
{
if (isalpha(prch))
{
word_count++;
}
}
prch = ch;
}
printf("单词数:%d\n大写字母数:%d\n小写字母数:%d\n标点符号数:%d\n数字字符数:%d\n", word_count, upper_count, lower_count, punct_count, digit_count);
return 0;
}

13.编写一个程序,反序显示命令行参数的单词。例如,命令行参数是 see you later,该程序应打印later you see.
cpp
int main(int argc, char* argv[])
{
for (int i = argc - 1; i > 0; i--)
{
printf("%s ", argv[i]);
}
return 0;
}

14.编写一个通过命令行运行的程序计算幂。第1个命令行参数是double 类型的数,作为幂的底数,第2个参数是整数,作为幂的指数。
cpp
int main(int argc, char* argv[])
{
if (argc != 3)
{
printf("Usage: %s base exponent\n", argv[0]);
return 1;
}
double base = atof(argv[1]);
int exponent = atoi(argv[2]);
double result = 1.0;
for (int i = 0; i < exponent; i++)
{
result *= base;
}
printf("%g^%d = %g\n", base, exponent, result);
return 0;
}

15.使用字符分类函数实现atoi()函数。如果输入的字符串不是纯数字,该函数返回0。
cpp
int my_atoi(char* str)
{
int result = 0;
while (*str)
{
if (!isdigit(*str))
{
return 0;
}
result = result * 10 + (*str - '0');
str++;
}
return result;
}
int main()
{
char str[] = "123";
char str2[] = "123s";
printf("%d\n", my_atoi(str));
printf("%d\n", my_atoi(str2));
return 0;
}

16.编写一个程序读取输入,直至读到文件结尾,然后把字符串打印出来。该程序识别和实现下面的命令行参数:粉动灯
-P 按原样打印
-u 把输入全部转换成大写
-l 把输入全部转换成小写
cpp
int main(int argc, char* argv[])
{
system("chcp 65001");
int flag = 0;
char str[100];
for (int i = 1; i < argc; i++)
{
if (strcmp(argv[i], "-P") == 0)
{
flag = 1;
}
else if (strcmp(argv[i], "-u") == 0)
{
flag = 2;
}
else if (strcmp(argv[i], "-l") == 0)
{
flag = 3;
}
else
{
printf("Usage: %s [-P] [-u] [-l]\n[-P] 按原样打印\n[-u] 把输入全部转换成大写\n[-l] 把输入全部转换成小写\n", argv[0]);
return 1;
}
while (fgets(str, sizeof(str), stdin))
{
switch (flag)
{
case 1:
printf("%s", str);
break;
case 2:
for (int i = 0; str[i]; i++)
{
str[i] = toupper(str[i]);
}
printf("%s", str);
break;
case 3:
for (int i = 0; str[i]; i++)
{
str[i] = tolower(str[i]);
}
printf("%s", str);
break;
}
}
}
return 0;
}
-P

-u

-l
