当前位置:   article > 正文

C Primer Plus 第十一章 课后答案_cprimerplus第十一章答案

cprimerplus第十一章答案

目录

 

复习题

1.下面字符串的声明有什么问题?

2.下面的程序会打印什么

3.下面的程序会打印什么

4.下面的程序会打印什么

5.下面的练习涉及字符串、循环、指针和递增指针。首先,假设定义了下面的函数:

考虑下面的函数调用: x = pr("Ho Ho Ho!");

a.将打印什么?

b.x是什么类型?

c.x的值是什么?

d.表达式*--pc是什么意思?与--*pc有何不同?

e.如果用*pc--替换*--pc,会打印什么?

f.两个while循环用来测试什么?

g.如果pr()函数的参数是空字符串,会怎样?

h.必须在主调函数中做什么,才能让pr()函数正常运行?

6.假设有如下声明:

char sign = '$';

sign占用多少字节的内存?'$'占用多少字节的内存?"$"占用多少字节的内存?

7.下面的程序会打印出什么

8.下面的程序会打印出什么

9.本章定义的s_gets()函数,用指针表示法代替数组表示法便可减少一个变量i。请改写该函数

10.strlen()函数接受一个指向字符串的指针作为参数,并返回该字符串的长度。请编写一个这样的函数

11.本章定义的s_gets()函数,可以用strchr()函数代替其中的while循环来查找换行符。请改写该函数

12.设计一个函数,接受一个指向字符串的指针,返回指向该字符串第1个空格字符的指针,或如果未找到空格字符,则返回空指针

13.重写程序清单11.21,使用ctype.h头文件中的函数,以便无论用户选择大写还是小写,该程序都能正确识别答案

编程练习

1.设计并测试一个函数,从输入中获取下n个字符(包括空白、制表符、换行符),把结果储存在一个数组里,它的地址被传递作为一个参数

2.修改并编程练习1的函数,在n个字符后停止,或在读到第1个空白、制表符或换行符时停止,哪个先遇到哪个停止。不能只使用scanf()

3.设计并测试一个函数,从一行输入中把一个单词读入一个数组中,并丢弃输入行中的其余字符。该函数应该跳过第1个非空白字符前面的所有空白。将一个单词定义为没有空白、制表符或换行符的字符序列

4.设计并测试一个函数,它类似编程练习3的描述,只不过它接受第2个参数指明可读取的最大字符数

5.设计并测试一个函数,搜索第1个函数形参指定的字符串,在其中查找第2个函数形参指定的字符首次出现的位置。如果成功,该函数返指向该字符的指针,如果在字符串中未找到指定字符,则返回空指针(该函数的功能与 strchr()函数相同)。在一个完整的程序中测试该函数,使用一个循环给函数提供输入值

6.编写一个名为is_within()的函数,接受一个字符和一个指向字符串的指针作为两个函数形参。如果指定字符在字符串中,该函数返回一个非零值(即为真)。否则,返回0(即为假)。在一个完整的程序中测试该函数,使用一个循环给函数提供输入值

7.strncpy(s1, s2, n)函数把s2中的n个字符拷贝至s1中,截断s2,或者有必要的话在末尾添加空字符。如果s2的长度是n或多于n,目标字符串不能以空字符结尾。该函数返回s1。自己编写一个这样的函数,名为mystrncpy()。在一个完整的程序中测试该函数,使用一个循环给函数提供输入值

8.编写一个名为string_in()的函数,接受两个指向字符串的指针作为参数。如果第2个字符串中包含第1个字符串,该函数将返回第1个字符串开始的地址。例如,string_in("hats", "at")将返回hats中a的地址。否则,该函数返回空指针。在一个完整的程序中测试该函数,使用一个循环给函数提供输入值

9.编写一个函数,把字符串中的内容用其反序字符串代替。在一个完整的程序中测试该函数,使用一个循环给函数提供输入值

10.编写一个函数接受一个字符串作为参数,并删除字符串中的空格。在一个程序中测试该函数,使用循环读取输入行,直到用户输入一行空行。该程序应该应用该函数只每个输入的字符串,并显示处理后的字符串

11.编写一个函数,读入10个字符串或者读到EOF时停止。该程序为用户提供一个有5个选项的菜单:打印源字符串列表、以ASCII中的顺序打印字符串、按长度递增顺序打印字符串、按字符串中第1个单词的长度打印字符串、退出。菜单可以循环显示,除非用户选择退出选项。当然,该程序要能真正完成菜单中各选项的功能

12.编写一个程序,读取输入,直至读到 EOF,报告读入的单词数、大写字母数、小写字母数、标点符号数和数字字符数。使用ctype.h头文件中的函数。

13.编写一个程序,反序显示命令行参数的单词。例如,命令行参数是 see you later,该程序应打印later you see。

14.编写一个通过命令行运行的程序计算幂。第1个命令行参数是double类型的数,作为幂的底数,第2个参数是整数,作为幂的指数。

15.使用字符分类函数实现atoi()函数。如果输入的字符串不是纯数字,该函数返回0。

16.编写一个程序读取输入,直至读到文件结尾,然后把字符串打印出来。该程序识别和实现下面的命令行参数:

-p  按原样打印

-u  把输入全部转换成大写

-l  把输入全部转换成小写

如果没有命令行参数,则让程序像是使用了-p参数那样运行


复习题

1.下面字符串的声明有什么问题?

  1. int main(void)
  2. {
  3. char name[] = {'F', 'e', 's', 's' };
  4. ...
  5. }

没有终结符'\0',不是一个字符串,是一个字符数组

2.下面的程序会打印什么

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. char note[] = "See you at the snack bar.";
  5. char *ptr;
  6. ptr = note;
  7. puts(ptr);
  8. puts(++ptr);
  9. note[7] = '\0';
  10. puts(note);
  11. puts(++ptr);
  12. return 0;
  13. }

See you at the snack bar.

ee you at the snack bar.

See you

e you//前面++了一次

3.下面的程序会打印什么

  1. #include <stdio.h>
  2. #include <string.h>
  3. int main(void)
  4. {
  5. char food [] = "Yummy";
  6. char *ptr;
  7. ptr = food + strlen(food);
  8. while (--ptr >= food)
  9. puts(ptr);
  10. return 0;
  11. }

y

my

mmy

ummy

Yummy

4.下面的程序会打印什么

  1. #include <stdio.h>
  2. #include <string.h>
  3. int main(void)
  4. {
  5. char goldwyn[40] = "art of it all ";
  6. char samuel[40] = "I read p";
  7. const char * quote = "the way through.";
  8. strcat(goldwyn, quote);
  9. strcat(samuel, goldwyn);
  10. puts(samuel);
  11. return 0;
  12. }

I read part of it all the way through.

5.下面的练习涉及字符串、循环、指针和递增指针。首先,假设定义了下面的函数:

  1. #include <stdio.h>
  2. char *pr(char *str)
  3. {
  4. char *pc;
  5. pc = str;
  6. while (*pc)
  7. putchar(*pc++);
  8. do 
  9. {
  10. putchar(*--pc);
  11. }while (pc - str);
  12. return (pc);
  13. }

考虑下面的函数调用: x = pr("Ho Ho Ho!");

a.将打印什么?

b.x是什么类型?

c.x的值是什么?

d.表达式*--pc是什么意思?与--*pc有何不同?

e.如果用*pc--替换*--pc,会打印什么?

f.两个while循环用来测试什么?

g.如果pr()函数的参数是空字符串,会怎样?

h.必须在主调函数中做什么,才能让pr()函数正常运行?

a. Ho Ho Ho!!oH oH oH

b. char*

c. 第一个H的地址

d. 当前指针所指元素的下一个元素的值;后者的值为当前元素的值 - 1

//*--pc的意思是把指针递减1,并使用存储在其位置上的值。--*pc指解引用pc所指向的值,然后把该值减一

e.  Ho Ho Ho! !oH oH o

//!之间会有一个空字符,一般不产生打印效果,但我所用的编译器打印了个空格- -

f. 检测pc是否指向字符串的空字符

g. 第一个循环检测为空不执行,第二个循环pc递减指向空字符前面的存储区,并把其中的内容当做字符打印,此后pc将不会等于str,这个循环过程将一直持续

h. 声明pr(): char* pr(char*);

6.假设有如下声明:

char sign = '$';

sign占用多少字节的内存?'$'占用多少字节的内存?"$"占用多少字节的内存?

  1. char型变量占一个字节
  2. 字符型常量一般当做int型存储,一般是2或4个字节,我所用的编译器是4个字节
  3. 字符串占2个字节,除了'$'还有一个空字符占一个字节

7.下面的程序会打印出什么

  1. #include <stdio.h>
  2. #include <string.h>
  3. #define M1 "How are ya, sweetie? "
  4. char M2[40] = "Beat the clock.";
  5. char * M3 = "chat";
  6. int main(void)
  7. {
  8. char words[80];
  9. printf(M1);
  10. puts(M1);
  11. puts(M2);
  12. puts(M2 + 1);
  13. strcpy(words, M2);
  14. strcat(words, " Win a toy.");
  15. puts(words);
  16. words[4] = '\0';
  17. puts(words);
  18. while (*M3)
  19. puts(M3++);
  20. puts(--M3);
  21. puts(--M3);
  22. M3 = M1;
  23. puts(M3);
  24. return 0;
  25. }

//直接编译打印的- -

How are ya, sweetie? How are ya, sweetie?
Beat the clock.
eat the clock.
Beat the clock. Win a toy.
Beat
chat
hat
at
t
t
at
How are ya, sweetie?

8.下面的程序会打印出什么

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. char str1 [] = "gawsie";
  5. char str2 [] = "bletonism";
  6. char *ps;
  7. int i = 0;
  8. for (ps = str1; *ps != '\0'; ps++)
  9. {
  10. if (*ps == 'a' || *ps == 'e')
  11. putchar(*ps);
  12. else
  13. (*ps)--;
  14. putchar(*ps);
  15. }
  16. putchar('\n');
  17. while (str2[i] != '\0') 
  18. {
  19. printf("%c", i % 3 ? str2[i] : '*');
  20. ++i;
  21. }
  22. return 0;
  23. }

faavrhee

//a和e要输出两次

*le*on*sm

9.本章定义的s_gets()函数,用指针表示法代替数组表示法便可减少一个变量i。请改写该函数

  1. char* s_gets(char* st, int n)
  2. {
  3. char* ret_val;
  4. int i = 0;
  5. ret_val = fgets(st, n, stdin);
  6. if (ret_val)
  7. {
  8. while (*st != '\n' && *st != '\0')
  9. st++;
  10. if (*st == '\n')
  11. *st = '\0';
  12. else
  13. while (getchar() != '\n')
  14. continue;
  15. }
  16. return ret_val;
  17. }

10.strlen()函数接受一个指向字符串的指针作为参数,并返回该字符串的长度。请编写一个这样的函数

  1. int sl(char* st)
  2. {
  3. int n = 0;
  4. while(*st++)
  5. {
  6. n++;
  7. }
  8. return n;
  9. }

11.本章定义的s_gets()函数,可以用strchr()函数代替其中的while循环来查找换行符。请改写该函数

  1. char* s_gets(char* st, int n)
  2. {
  3. char* ret_val;
  4. int i = 0;
  5. ret_val = fgets(st, n, stdin);
  6. if (ret_val)
  7. {
  8. char* f = strchr(st, '\n');
  9. if (f)
  10. *f = '\0';
  11. else
  12. while (getchar() != '\n')
  13. continue;
  14. }
  15. return ret_val;
  16. }

12.设计一个函数,接受一个指向字符串的指针,返回指向该字符串第1个空格字符的指针,或如果未找到空格字符,则返回空指针

  1. char* fs(char* st)
  2. {
  3. while(*st++)
  4. {
  5. if(*st == ' ')
  6. {
  7. return st;
  8. }
  9. }
  10. return NULL;
  11. }

13.重写程序清单11.21,使用ctype.h头文件中的函数,以便无论用户选择大写还是小写,该程序都能正确识别答案

  1. #include <stdio.h>
  2. #include <string.h> // strcmp()函数的原型在该头文件中
  3. #include <ctype.h>
  4. #define ANSWER "grant"
  5. #define SIZE 40
  6. char * s_gets(char * st, int n);
  7. char* tl(char* a)
  8. {
  9. char* b = a;
  10. while(*a)//不能写*a++或者*++a, 其效果都是递增一位再解引用
  11. {
  12. *a = tolower(*a);
  13. a++;
  14. }
  15. return b;
  16. }
  17. int main(void)
  18. {
  19. char try[SIZE];
  20. puts("Who is buried in Grant's tomb?");
  21. s_gets(try, SIZE);
  22. while (strcmp(tl(try), ANSWER) != 0)
  23. {
  24. puts(try);
  25. puts("No, that's wrong. Try again.");
  26. s_gets(try, SIZE);
  27. }
  28. puts("That's right!");
  29. return 0;
  30. }
  31. char * s_gets(char * st, int n)
  32. {
  33. char * ret_val;
  34. int i = 0;
  35. ret_val = fgets(st, n, stdin);
  36. if (ret_val)
  37. {
  38. while (st[i] != '\n' && st[i] != '\0')
  39. i++;
  40. if (st[i] == '\n')
  41. st[i] = '\0';
  42. else
  43. while (getchar() != '\n')
  44. continue;
  45. }
  46. return ret_val;
  47. }

编程练习

1.设计并测试一个函数,从输入中获取下n个字符(包括空白、制表符、换行符),把结果储存在一个数组里,它的地址被传递作为一个参数

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. void func(char* a, int n)
  5. {
  6. int i;
  7. for (i = 0; i < n; ++i)
  8. {
  9. a[i] = getchar();
  10. }
  11. a[i] = '\0';
  12. }
  13. int main(void)
  14. {
  15. int n;
  16. scanf("%d", &n);
  17. char a[n + 1];
  18. func(a, n);
  19. puts(a);
  20. return 0;
  21. }

2.修改并编程练习1的函数,在n个字符后停止,或在读到第1个空白、制表符或换行符时停止,哪个先遇到哪个停止。不能只使用scanf()

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. void func(char* a, int n)
  5. {
  6. int i;
  7. for (i = 0; i < n; ++i)
  8. {
  9. a[i] = getchar();
  10. if(a[i] <= ' ')
  11. {
  12. break;
  13. }
  14. }
  15. a[i] = '\0';
  16. }
  17. int main(void)
  18. {
  19. int n;
  20. scanf("%d", &n);
  21. getchar();
  22. char a[n + 1];
  23. func(a, n);
  24. puts(a);
  25. return 0;
  26. }

3.设计并测试一个函数,从一行输入中把一个单词读入一个数组中,并丢弃输入行中的其余字符。该函数应该跳过第1个非空白字符前面的所有空白。将一个单词定义为没有空白、制表符或换行符的字符序列

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5. void func(char* a)
  6. {
  7. char ch;
  8. while ((ch = getchar()) <= ' ')
  9. {
  10. continue;
  11. }
  12. while(ch > ' ')//不能在这里写个getchar,第一次循环时已经读入了一个非空白符
  13. {
  14. *a = ch;
  15. a++;
  16. ch = getchar();
  17. }
  18. }
  19. int main(void)
  20. {
  21. char a[101];
  22. func(a);
  23. puts(a);
  24. return 0;
  25. }

4.设计并测试一个函数,它类似编程练习3的描述,只不过它接受第2个参数指明可读取的最大字符数

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5. void func(char* a, int n)
  6. {
  7. char ch;
  8. int i = 0;
  9. while ((ch = getchar()) <= ' ')
  10. {
  11. continue;
  12. }
  13. while(ch > ' ' && i < n)//不能在这里写个getchar,第一次循环时已经读入了一个非空白符
  14. {
  15. *a = ch;
  16. i++;
  17. a++;
  18. ch = getchar();
  19. }
  20. }
  21. int main(void)
  22. {
  23. int n;
  24. scanf("%d", &n);
  25. char a[n + 1];
  26. func(a, n);
  27. puts(a);
  28. return 0;
  29. }

5.设计并测试一个函数,搜索第1个函数形参指定的字符串,在其中查找第2个函数形参指定的字符首次出现的位置。如果成功,该函数返指向该字符的指针,如果在字符串中未找到指定字符,则返回空指针(该函数的功能与 strchr()函数相同)。在一个完整的程序中测试该函数,使用一个循环给函数提供输入值

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5. char* func(char* a, char b)
  6. {
  7. while (*a)
  8. {
  9. if(*a == b)
  10. {
  11. return a;
  12. }
  13. a++;
  14. }
  15. return NULL;
  16. }
  17. int main(void)
  18. {
  19. char ch = getchar();
  20. getchar();
  21. char a[101];
  22. gets(a);
  23. char* x = func(a, ch);
  24. if(x)
  25. {
  26. putchar(*x);
  27. }
  28. else
  29. {
  30. puts("NONE");
  31. }
  32. return 0;
  33. }

6.编写一个名为is_within()的函数,接受一个字符和一个指向字符串的指针作为两个函数形参。如果指定字符在字符串中,该函数返回一个非零值(即为真)。否则,返回0(即为假)。在一个完整的程序中测试该函数,使用一个循环给函数提供输入值

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int is_within(char* a, char b)
  4. {
  5. while(*a)
  6. {
  7. if(*a == b)
  8. {
  9. return 1;
  10. }
  11. a++;
  12. }
  13. return 0;
  14. }
  15. int main()
  16. {
  17. char b, a[101];
  18. while(1)
  19. {
  20. b = getchar();
  21. getchar();
  22. gets(a);
  23. if(is_within(a, b))
  24. {
  25. puts("Y");
  26. }
  27. else
  28. {
  29. puts("N");
  30. }
  31. }
  32. return 0;
  33. }

7.strncpy(s1, s2, n)函数把s2中的n个字符拷贝至s1中,截断s2,或者有必要的话在末尾添加空字符。如果s2的长度是n或多于n,目标字符串不能以空字符结尾。该函数返回s1。自己编写一个这样的函数,名为mystrncpy()。在一个完整的程序中测试该函数,使用一个循环给函数提供输入值

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void mystrncpy(char *a, char *b, int n)
  4. {
  5. while(*a && n--)
  6. {
  7. *b = *a;
  8. a++;
  9. b++;
  10. }
  11. if(n)
  12. {
  13. *b = '\0';
  14. }
  15. }
  16. int main()
  17. {
  18. char b[101], a[101];
  19. int n;
  20. while(1)
  21. {
  22. scanf("%d", &n);
  23. gets(a);
  24. mystrncpy(a, b, n);
  25. puts(b);
  26. }
  27. return 0;
  28. }

8.编写一个名为string_in()的函数,接受两个指向字符串的指针作为参数。如果第2个字符串中包含第1个字符串,该函数将返回第1个字符串开始的地址。例如,string_in("hats", "at")将返回hats中a的地址。否则,该函数返回空指针。在一个完整的程序中测试该函数,使用一个循环给函数提供输入值

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5. void get_nextval(const char* t, int a[], int n)
  6. {
  7. int i = 0, j = -1;
  8. a[0] = -1;
  9. /*
  10. memset(a, -1, sizeof(int) * n);
  11. printf("%c%3c |", 'i', 'j');
  12. for (int k = 0; k < n; ++k) {
  13. printf("%3c", t[k]);
  14. }
  15. printf(" |%3c%3c\n", 'i', 'j');
  16. printf("--------------------------------\n");
  17. */
  18. while(i < n)
  19. {
  20. //printf("%d%3d |", i, j);
  21. if(j == -1 || t[i] == t[j])
  22. {
  23. ++i;
  24. ++j;
  25. if(t[i] != t[j])
  26. {
  27. a[i] = j;
  28. }
  29. else
  30. {
  31. a[i] = a[j];
  32. }
  33. }
  34. else
  35. {
  36. j = a[j];
  37. }
  38. /*
  39. for (int k = 0; k < n; ++k) {
  40. printf("%3d", a[k]);
  41. }
  42. printf(" |%3d%3d", i, j);
  43. putchar('\n');
  44. */
  45. }
  46. }
  47. char* string_in(char* s1, char* s2)//顺带复习KMP了- -
  48. {
  49. int n2 = 0, n1 = 0;
  50. char* a = s2;
  51. while(*a)
  52. {
  53. n2++;
  54. a++;
  55. }
  56. a = s1;
  57. while(*a)
  58. {
  59. n1++;
  60. a++;
  61. }
  62. int next[n2];
  63. get_nextval(s2, next, n2);
  64. int i = 0, j = -1;
  65. while(i < n1 && j < n2)
  66. {
  67. if(j == -1 || s1[i] == s2[j])
  68. {
  69. ++i;
  70. ++j;
  71. }
  72. else
  73. {
  74. j = next[j];
  75. }
  76. }
  77. if(j == n2)
  78. {
  79. return &s1[i - n2];
  80. }
  81. return NULL;
  82. }
  83. int main(void)
  84. {
  85. char s1[101], s2[101];
  86. gets(s1);
  87. gets(s2);
  88. char* x = string_in(s1, s2);
  89. if(x)
  90. {
  91. putchar(*x);
  92. }
  93. else
  94. {
  95. puts("N");
  96. }
  97. return 0;
  98. }
  99. /*
  100. ababcabcabdab
  101. abcabd
  102. */

9.编写一个函数,把字符串中的内容用其反序字符串代替。在一个完整的程序中测试该函数,使用一个循环给函数提供输入值

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void vers(char *a)
  4. {
  5. int n = 0;
  6. char* b = a;
  7. while(*b)//不能直接用a计算,后面要用a,不能改变a的值-_-||
  8. {
  9. n++;
  10. b++;
  11. }
  12. char t;
  13. int x = n / 2;//同上,不能写n /= 2 -_-||
  14. for(int i = 0; i < x; i++)
  15. {
  16. t = *(a + i);
  17. *(a + i) = *(a + n - 1 - i);
  18. *(a + n - 1 - i) = t;
  19. }
  20. }
  21. int main()
  22. {
  23. char a[101];
  24. while(1)
  25. {
  26. gets(a);
  27. vers(a);
  28. puts(a);
  29. }
  30. return 0;
  31. }

10.编写一个函数接受一个字符串作为参数,并删除字符串中的空格。在一个程序中测试该函数,使用循环读取输入行,直到用户输入一行空行。该程序应该应用该函数只每个输入的字符串,并显示处理后的字符串

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int ds(char *a)
  4. {
  5. char *b = a;
  6. int n = 0;
  7. while (*b)
  8. {
  9. n++;
  10. b++;
  11. }
  12. char c[n + 1];
  13. char *d = c;
  14. b = a;
  15. while(*b)
  16. {
  17. if(*b == ' ')
  18. {
  19. b++;
  20. }
  21. else
  22. {
  23. *d = *b;
  24. b++;
  25. d++;
  26. }
  27. }
  28. *d = '\0';
  29. b = a;
  30. d = c;
  31. while (*d)
  32. {
  33. *b = *d;
  34. b++;
  35. d++;
  36. }
  37. *b = '\0';
  38. if(*a)
  39. {
  40. return 1;
  41. }
  42. return 0;
  43. }
  44. int main()
  45. {
  46. char a[101];
  47. int f = 1;
  48. while(f)
  49. {
  50. gets(a);
  51. f = ds(a);
  52. puts(a);
  53. }
  54. return 0;
  55. }
  56. // a b c d e f g h

11.编写一个函数,读入10个字符串或者读到EOF时停止。该程序为用户提供一个有5个选项的菜单:打印源字符串列表、以ASCII中的顺序打印字符串、按长度递增顺序打印字符串、按字符串中第1个单词的长度打印字符串、退出。菜单可以循环显示,除非用户选择退出选项。当然,该程序要能真正完成菜单中各选项的功能

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5. void strprint(char *a[])
  6. {
  7. for (int i = 0; i < 10; ++i) {
  8. puts(a[i]);
  9. }
  10. }
  11. void ASCIISort(char *a[])
  12. {
  13. char *t;
  14. for (int i = 0; i < 9; ++i) {
  15. for (int j = i + 1; j < 10; ++j) {
  16. if(strcmp(a[i], a[j]) > 0)
  17. {
  18. t = a[i];
  19. a[i] = a[j];
  20. a[j] = t;
  21. }
  22. }
  23. }
  24. strprint(a);
  25. }
  26. void LengthSort(char *a[])
  27. {
  28. char *t;
  29. for (int i = 0; i < 9; ++i) {
  30. for (int j = i + 1; j < 10; ++j) {
  31. if(strlen(a[i]) > strlen(a[j]))
  32. {
  33. t = a[i];
  34. a[i] = a[j];
  35. a[j] = t;
  36. }
  37. }
  38. }
  39. strprint(a);
  40. }
  41. int FWcmp(char *a, char *b)
  42. {
  43. int an = 0, bn = 0;
  44. while(*a && !isalpha(*a))
  45. {
  46. a++;
  47. }
  48. while(*a && isalpha(*a))
  49. {
  50. a++;
  51. an++;
  52. }
  53. while(*b && !isalpha(*b))
  54. {
  55. b++;
  56. }
  57. while(*b && isalpha(*b))
  58. {
  59. b++;
  60. bn++;
  61. }
  62. if(an > bn)
  63. {
  64. return 1;
  65. }
  66. return 0;
  67. }
  68. void FWLengthSort(char *a[])
  69. {
  70. char *t;
  71. for (int i = 0; i < 9; ++i) {
  72. for (int j = i + 1; j < 10; ++j) {
  73. if(FWcmp(a[i], a[j]))
  74. {
  75. t = a[i];
  76. a[i] = a[j];
  77. a[j] = t;
  78. }
  79. }
  80. }
  81. strprint(a);
  82. }
  83. void pro(char **a)
  84. {
  85. int n;
  86. puts("input from 1 to 5 to select from the followed options:");
  87. puts("1)print 2)ASCII");
  88. puts("3)Length 4)FWLength");
  89. puts("5)quit");
  90. while(~scanf("%d", &n) && n != 5)
  91. {
  92. switch (n)
  93. {
  94. case 1:
  95. strprint(a);
  96. case 2:
  97. ASCIISort(a);
  98. break;
  99. case 3:
  100. LengthSort(a);
  101. break;
  102. case 4:
  103. FWLengthSort(a);
  104. break;
  105. default:
  106. break;
  107. }
  108. }
  109. }
  110. int main()
  111. {
  112. FILE* in = fopen("F:\\C_Codes\\draft\\123.txt", "r");
  113. char a[10][101];
  114. for (int i = 0; i < 10; ++i) {
  115. fgets(a[i], 100, in);
  116. }
  117. char *b[10];
  118. for (int j = 0; j < 10; ++j) {
  119. b[j] = a[j];
  120. }
  121. pro(b);
  122. return 0;
  123. }

怎么设置形参这里试验出现了几个问题:

  1. char (*a)[]     这样设置形参无法通过赋值传地址,会出现类型不匹配,也不能 a + i = d 这样赋值,是个非法表达式
  2. char **a        无法通过 a + i 或 a[i] 来取得字符串首地址,编译器识别为地址的地址,而不是二维数组

所以,选择使用传入复制的地址数组,通过改变地址数组的排序达到排序的目的

12.编写一个程序,读取输入,直至读到 EOF,报告读入的单词数、大写字母数、小写字母数、标点符号数和数字字符数。使用ctype.h头文件中的函数。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5. int main()
  6. {
  7. FILE* in = fopen("F:\\C_Codes\\draft\\123.txt", "r");
  8. char ch;
  9. int un = 0, ln = 0, wn = 0, pn = 0, nn = 0, f = 0;
  10. while((ch = getc(in)) != EOF)
  11. {
  12. if(isupper(ch))
  13. {
  14. un++;
  15. f = 1;
  16. }
  17. else if(islower(ch))
  18. {
  19. ln++;
  20. f = 1;
  21. }
  22. else if(ispunct(ch))
  23. {
  24. pn++;
  25. if(f)
  26. {
  27. wn++;
  28. f = 0;
  29. }
  30. }
  31. else if(isdigit(ch))
  32. {
  33. nn++;
  34. }
  35. }
  36. printf("%d %d %d %d %d\n", wn, un, ln, pn, nn);
  37. fclose(in);
  38. return 0;
  39. }

13.编写一个程序,反序显示命令行参数的单词。例如,命令行参数是 see you later,该程序应打印later you see。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5. int main(int argc, char** argv)
  6. {
  7. for (int i = argc - 1; i > 0 ; --i) {
  8. printf("%s ", argv[i]);
  9. }
  10. return 0;
  11. }

14.编写一个通过命令行运行的程序计算幂。第1个命令行参数是double类型的数,作为幂的底数,第2个参数是整数,作为幂的指数。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5. int main(int argc, char** argv)
  6. {
  7. char *end;
  8. double a = strtod(argv[1], &end);
  9. long b = strtol(argv[2], &end, 10);
  10. double sum = 1.0;
  11. for (long i = 0; i < b; ++i) {
  12. sum *= a;
  13. }
  14. printf("%lf\n", sum);
  15. return 0;
  16. }

15.使用字符分类函数实现atoi()函数。如果输入的字符串不是纯数字,该函数返回0。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5. int myatoi(char *a)
  6. {
  7. int n = 0;
  8. int len = 0;
  9. while(*a)
  10. {
  11. n *= 10;
  12. if(!isdigit(*a))
  13. {
  14. return 0;
  15. }
  16. n += *a - '0';
  17. a++;
  18. }
  19. return n;
  20. }
  21. int main()
  22. {
  23. char a[101];
  24. gets(a);
  25. printf("%d\n", myatoi(a));
  26. return 0;
  27. }

16.编写一个程序读取输入,直至读到文件结尾,然后把字符串打印出来。该程序识别和实现下面的命令行参数:

-p  按原样打印

-u  把输入全部转换成大写

-l  把输入全部转换成小写

如果没有命令行参数,则让程序像是使用了-p参数那样运行

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5. int main(int argc, char **argv)
  6. {
  7. int n;
  8. if(argv[1][1] == 'p' || argc == 1)
  9. {
  10. n = 1;
  11. }
  12. else if(argv[1][1] == 'u')
  13. {
  14. n = 2;
  15. }
  16. else if(argv[1][1] == 'l')
  17. {
  18. n = 3;
  19. }
  20. FILE* in = fopen("F:\\C_Codes\\draft\\123.txt", "r");
  21. char ch;
  22. while ((ch = fgetc(in)) != EOF)
  23. {
  24. if(n == 1)
  25. {
  26. putchar(ch);
  27. }
  28. else if(n == 2)
  29. {
  30. if(isalpha(ch))
  31. {
  32. putchar(toupper(ch));
  33. continue;
  34. }
  35. putchar(ch);
  36. }
  37. else
  38. {
  39. if(isalpha(ch))
  40. {
  41. putchar(tolower(ch));
  42. continue;
  43. }
  44. putchar(ch);
  45. }
  46. }
  47. return 0;
  48. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/348601
推荐阅读
相关标签
  

闽ICP备14008679号