• 《C和指针》章节后编程练习解答参考——第9章


    9.1

     1 #include <stdio.h>
     2 #include <ctype.h>
     3 #include <string.h>
     4 
     5 #define  N  100
     6 
     7 int main (void)
     8 {
     9     int i = 0;
    10     char strarray[N+1]; //= "Hello world!    	3I'm here!";
    11     char *input = strarray;
    12     char ch;
    13     unsigned int cont = 0;
    14     int ctr=0, spc=0, num=0, low=0, upp=0, puc=0, upr=0;
    15     float ctrf=0, spcf=0, numf=0, lowf=0, uppf=0, pucf=0, uprf=0;
    16 
    17     printf("Please enter a string:
    ");
    18 
    19     while (( ch = getchar() ) != '
    ')
    20     {    
    21         *(input + i) = ch;
    22         i++;    
    23     }
    24     *(input + i) = '';
    25     cont = strlen(input);
    26 
    27     while (*input != '') 
    28     {
    29         if (iscntrl(*input))
    30             ctr++;
    31         if (isspace(*input))
    32             spc++;
    33         if (isdigit(*input))
    34             num++;
    35         if (islower(*input))
    36             low++;
    37         if (isupper(*input))
    38             upp++;
    39         if (ispunct(*input))
    40             puc++;
    41         if (!(isprint(*input)))
    42             upr++;
    43         input++;
    44     }
    45 
    46     printf("
    Totle char number is: Count = %d
    ", cont);
    47     printf("cntrl = %d,	space = %d,	digit = %d
    ", ctr, spc, num);
    48     printf("lower = %d,	upper = %d,	punct = %d
    ", low, upp, puc);
    49     printf("uprint = %d
    ", upr);
    50 
    51     ctrf = (float)ctr/(float)cont;
    52     spcf = (float)spc/(float)cont;
    53     numf = (float)num/(float)cont;
    54     lowf = (float)low/(float)cont;
    55     uppf = (float)upp/(float)cont;
    56     pucf = (float)puc/(float)cont;
    57     uprf = (float)upr/(float)cont;
    58 
    59     printf("
    Here is the percent of every count:
    ");
    60     printf("cntrl = %.3f%%
    space = %.3f%%
    digit = %.3f%%
    ",ctrf*100 , spcf*100, numf*100);
    61     printf("lower = %.3f%%
    upper = %.3f%%
    punct = %.3f%%
    ", lowf*100, uppf*100, pucf*100);
    62     printf("uprnt = %.3f%%
    ", uprf*100);
    63 
    64     getchar();
    65     return 0;
    66 }

    9.3

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 void my_strcpy(char *dst, char *src)
     5 {
     6     size_t len = 0, dstlen = 0, srclen = 0;
     7     dstlen = strlen(dst);
     8     srclen = strlen(src);
     9 
    10     len = ( dstlen >= srclen ? srclen : dstlen );
    11     strncpy(dst, src, len);
    12 }
    13 
    14 void show_string(char *str)
    15 {
    16     while (*str != '')
    17         printf("%c", *str++);
    18     putchar('
    ');
    19 }
    20 
    21 int main (void)
    22 {
    23     char dst[6] = "Hello";
    24     char src[10] = "I'm here!";
    25     char *dstp = dst;
    26     char *srcp = src;
    27 
    28     my_strcpy(dstp, srcp);
    29 
    30     show_string(dstp);
    31     show_string(srcp);
    32 
    33     getchar();
    34     return 0;
    35 }

    9.4

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 #define  M  12
     5 #define  N  16
     6 
     7 void my_strcat(char *dst, char *src)
     8 {
     9     size_t len = 0, dstlen = 0, srclen = 0, restlen = 0;
    10     dstlen = strlen(dst);
    11     srclen = strlen(src);
    12     
    13     len = ( (restlen = M - dstlen - 1) > srclen ? srclen : restlen );
    14     strncat(dst, src, len);
    15 }
    16 
    17 void show_string(char *str)
    18 {
    19     while (*str != '')
    20         printf("%c", *str++);
    21     putchar('
    ');
    22 }
    23 
    24 int main (void)
    25 {
    26     char dst[M] = "Hello!";
    27     char src[N] = "I'm here!";
    28     char *dstp = dst;
    29     char *srcp = src;
    30 
    31     my_strcat(dst, src);
    32 
    33     show_string(dstp);
    34     show_string(srcp);
    35 
    36     getchar();
    37     return 0;
    38 }

    9.5

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 #define  M  12
     5 #define  N  16
     6 
     7 void my_strncat(char *dest, char *src, int dest_len)
     8 {
     9     size_t len = 0, dstlen = 0, srclen = 0, restlen = 0;
    10     dstlen = strlen(dest);
    11     srclen = strlen(src);
    12     
    13     len = ( (restlen = dest_len - dstlen - 1) > srclen ? srclen : restlen );
    14     strncat(dest, src, len);
    15 }
    16 
    17 void show_string(char *str)
    18 {
    19     while (*str != '')
    20         printf("%c", *str++);
    21     putchar('
    ');
    22 }
    23 
    24 int main (void)
    25 {
    26     char dst[M] = "Hello!";
    27     char src[N] = "I'm here!";
    28     char *dstp = dst;
    29     char *srcp = src;
    30 
    31     my_strncat(dst, src, M);
    32 
    33     show_string(dstp);
    34     show_string(srcp);
    35 
    36     getchar();
    37     return 0;
    38 }

    9.6

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 char *my_strcpy_end(char *dst, char *src)
     5 {
     6     int i, dstlen = 0, srclen = 0;
     7     
     8     dstlen = strlen(dst);
     9     srclen = strlen(src);
    10 
    11     if ( dstlen >= srclen )
    12         strcpy(dst, src);
    13     else
    14         strncpy(dst, src, dstlen);
    15 
    16     for ( i = 0; *(dst + i) != ''; i++);
    17     return dst + i;
    18 }
    19 
    20 int main (void)
    21 {
    22     char *p = NULL;
    23     char dst[] = "Hello world";
    24     //char src[] = "123456789";
    25     char src[] = "123456789123456789";
    26 
    27     p = my_strcpy_end(dst, src);
    28 
    29     printf("%c
    ", *(p - 1));
    30 
    31     getchar();
    32     return 0;
    33 }


    9.8

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 char *my_strnchr( char const *str, int ch, int which )
     5 {
     6     int i;
     7     char *p = NULL;
     8     p = str;
     9 
    10     for ( i = 0; i < which; i++)
    11     {
    12         if ( i != 0)
    13             p++;
    14         p = strchr(p, ch);
    15     }
    16 
    17     return p;
    18 }
    19 
    20 int main (void)
    21 {
    22     int i;
    23     char str[] = "Hello world!";
    24     int chr = 'l';
    25     int which = 2;
    26 
    27     char *find = my_strnchr(str, chr, which);
    28 
    29     for (i = -1; i < 2; i++)
    30         printf("%c	", *(find + i));
    31     putchar('
    ');
    32 
    33     getchar();
    34     return 0;
    35 }

    9.9

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 int count_chars(char const *str, char const *chars)
     5 {
     6     int count = 0, len = 0;
     7     char *pos = NULL;
     8     pos = str;
     9 
    10     while (( pos = strpbrk(pos, chars) ) != NULL )
    11     {
    12         count++;
    13         pos++;
    14     }
    15 
    16     return count;
    17 }
    18 
    19 int main (void)
    20 {
    21     char str[] = "Hello world!";
    22     char chars[] = "ero";
    23 
    24     printf("%d
    ", count_chars(str, chars));
    25 
    26     getchar();
    27     return 0;
    28 }

    9.10

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <string.h>
     4 #include <ctype.h>
     5 
     6 int palindrome( char *string )
     7 {
     8     int i, j = 0;
     9     int len = strlen(string);
    10     char *strcopy = NULL;
    11     strcopy = malloc((len + 1)* sizeof(char));
    12     for (i = 0; i < len; i++)            //将源字符串中的非字母字符去掉,并将剩下的字母转换为小写
    13     {
    14         if (isalpha(*(string + i)))
    15         {
    16             *(strcopy + j) =  tolower( *(string + i) );
    17             j++;
    18         }
    19     }
    20     *(strcopy + j) = '';
    21     
    22     len = strlen(strcopy);
    23     for (i = 0; i < (len / 2); i++)
    24     {
    25         if ( (*(strcopy + i)) != (*(strcopy + (len - i - 1) ) ) )
    26             return 0;
    27     }
    28 
    29     return 1;
    30 }
    31 
    32 int main (void)
    33 {
    34     char string[] = "Madam, I'm Adam!";
    35     int result = 0;
    36 
    37     result = palindrome(string);
    38     printf("%d
    ", result);
    39 
    40     getchar();
    41     return 0;
    42 }

    9.11

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 int main (void)
     5 {
     6     char input[101];
     7     char chars[] = "the";
     8     int i = 0, count = 0;
     9     char *pos = NULL;
    10 
    11     printf("Please enter some words: 
    ");
    12     scanf("%s", input);
    13     printf("%s
    ", input);
    14 
    15     pos = input;
    16     while ((pos = strstr(pos, chars)) != NULL)
    17     {
    18         pos++;
    19         count++;
    20     }
    21 
    22     printf("There are %d "%s"!", count, chars);
    23 
    24     getchar();
    25     getchar();
    26     return 0;
    27 }

    9.12  9.13  9.14

      1 #include <stdio.h>
      2 #include <string.h>
      3 #include <ctype.h>
      4 
      5 char *init_alp(char *temp)
      6 {
      7     int i;
      8     char alp = 'A';
      9 
     10     for (i = 0; i < 26; i++)
     11     {
     12         
     13         *(temp + i) = alp;
     14         alp++;
     15     }
     16     *(temp + i) = '';
     17 
     18     return temp;
     19 }
     20 
     21 int prepare_key( char *key )                        //生成key
     22 {
     23     int i = 0, j = 0, k = 0;
     24     char alp[27];
     25     char *temp = alp;
     26     
     27     char *p = NULL; 
     28 
     29     if (key == NULL)                                        //key为空,退出
     30         return 0;
     31 
     32     for (i = 0; *(key + i) != ''; i++)
     33         if (!(isalpha(*(key + i))))                    //key中含有非字母字符,退出)
     34             return 0;
     35 
     36     for (i = 0; *(key + i) != ''; i++)
     37     {
     38         if (*(key + i) != ' ')                                //删除所有的空格
     39         {
     40             for (j = i + 1; *(key + j) != ''; j++)        //将重复的字母赋值为空格
     41             {
     42                 if ( *(key + i) == *(key + j) )
     43                     *(key + j) = ' ';
     44             }
     45             *(key + k) = toupper(*(key + i));
     46             k++;
     47         }        
     48     }
     49     *(key + k) = '';
     50 
     51     temp = init_alp(temp);                                //初始化为大写字母表
     52     p = temp;
     53     while ((p = (strpbrk(p, key))) != NULL)                //将字母表中含有key中的字母设置为空格
     54     {
     55         *p = ' ';
     56         p++;
     57     }
     58 
     59     for (i = 0, k = 0; *(temp + i) != ''; i++)        //删除所有的空格
     60     {
     61         if (*(temp + i) != ' ')                                
     62         {
     63             *(temp + k) = *(temp + i);
     64             k++;
     65         }
     66     }
     67     *(temp + k) = '';
     68 
     69     key = strcat(key, temp);
     70 
     71     return 1;
     72 }
     73 
     74 void encrypt( char *data, char const *key )            //给数据加密
     75 {
     76     int i, state;
     77     char temp[27];
     78     char *init = NULL;
     79     char *p = NULL;
     80     char chg;
     81 
     82     init = init_alp(temp);
     83     
     84     for (i = 0; *(data + i) != ''; i++)
     85     {
     86         if (isalpha(*(data + i)))
     87         {
     88             if (isupper(*(data + i)))
     89                 state = 1;
     90             else
     91             {
     92                 *(data + i) = toupper(*(data + i));
     93                 state = 0;
     94             }
     95             p = strchr(init, *(data + i));
     96             chg = *(key + (p - init));
     97             *(data + i) = state ? chg : tolower(chg);
     98         }
     99     }
    100 }
    101 
    102 void decrypt( char *data, char const *key )            //给数据解密
    103 {
    104     int i, state;
    105     char temp[27];
    106     char *init = NULL;
    107     char *p = NULL;
    108     char chg;
    109 
    110     init = init_alp(temp);
    111     
    112     for (i = 0; *(data + i) != ''; i++)
    113     {
    114         if (isalpha(*(data + i)))
    115         {
    116             if (isupper(*(data + i)))
    117                 state = 1;
    118             else
    119             {
    120                 *(data + i) = toupper(*(data + i));
    121                 state = 0;
    122             }
    123             p = strchr(key, *(data + i));
    124             chg = *(init + (p - key));
    125             *(data + i) = state ? chg : tolower(chg);
    126         }
    127     }
    128 }
    129 
    130 int main (void)
    131 {
    132     char key[28] = "Hellomnnnnab";
    133     char temp[28];
    134     char *key_m = temp;
    135     char data[] = "Hello world!";
    136     
    137     key_m = init_alp(key_m);
    138     printf("%s
    ", key);                //显示输入的key
    139 
    140     if (prepare_key(key))
    141     {
    142         printf("
    Alpha: 
    ");            //显示大写字母表
    143         printf("%s
    ", key_m);
    144         printf("
    Key: 
    ");            //显示生成的key秘钥
    145         printf("%s
    ", key);
    146 
    147         printf("
    Encode: 
    ");
    148         printf("%s
    ", data);
    149         encrypt(data, key);                //加密
    150         printf("%s
    ", data);            
    151 
    152         printf("
    Decode: 
    ");
    153         printf("%s
    ", data);
    154         decrypt(data, key);                //解密
    155         printf("%s
    ", data);        
    156     }
    157     else
    158         printf("Key error!
    ");
    159 
    160 
    161     getchar();
    162     return 0;
    163 }


    9.15

      1 #include <stdio.h>
      2 #include <string.h>
      3 #include <ctype.h>
      4 
      5 void dollars(char *dest, char const *src)
      6 {
      7     int i, j, srclen = 0, offset = 0, state = 0;
      8     int a = 0, b = 0;
      9     char *destbak = NULL;
     10     destbak = dest;
     11 
     12         srclen = strlen(src);
     13         *dest++ = '$';
     14 
     15     if (srclen >= 3)
     16     {
     17         a = (srclen - 2) / 3;
     18         b = (srclen - 2) % 3;
     19 
     20         for (i = 0; (i < a); i++)
     21         {
     22             if ( i == 0 )
     23             {
     24                 for (j = 0; j < b; j++)
     25                 {
     26                     *(dest++) = *(src++);
     27                 }
     28             }
     29 
     30             if (b != 0)
     31                 *(dest++) = ',';
     32 
     33             for (j = 0; j < 3; j++)
     34                 *(dest++) = *(src++);
     35         }
     36 
     37         if ((a == 0) && (b != 0))
     38         {
     39             for (j = 0; j < b; j++)
     40             {
     41                 *(dest++) = *(src++);
     42             }
     43         }
     44         *((dest++)) = '.';
     45         
     46         for ( ; *(src) != '';dest++, src++)
     47             *(dest) = *(src);
     48         *(dest) = '';
     49     }
     50     else
     51     {
     52         memset(dest, '0', 4);
     53         *(++dest) = '.';
     54         dest++;
     55         for (i = 0; i < 2 - srclen; i++)
     56             *(dest++) = '0';
     57 
     58         for (i = 0; i < srclen; i++)
     59             *(dest + i) = *(src + i);
     60     }
     61 }
     62 
     63 int dollchk(char *src)                            //检查要处理的数据中是否有非数字字符
     64 {
     65     int i;
     66     for (i = 0; *(src + i) != ''; i++)                
     67     {
     68         if (!isdigit(*(src + i)))
     69         {
     70             return 0;
     71         }
     72     }
     73     return 1;
     74 }
     75 
     76 int main (void)
     77 {
     78     char temp[20] = { 0 };                //目标缓存
     79     char dollar[20];
     80     char *dest = temp;
     81     int state = 0;
     82 
     83     printf("Please enter some numbers: 
    ");
     84     scanf("%s", dollar);
     85 
     86     state = dollchk(dollar);
     87     if (!state)                            //检查要处理的数据中含有非数字字符,报错,退出
     88     {
     89         printf("Data error!
    ");
     90         getchar();
     91         getchar();
     92         return 0;
     93     }
     94 
     95     printf("%s
    ", dest);
     96     printf("%s
    ", dollar);
     97 
     98     dollars(dest, dollar);
     99     if (*dest != '')
    100         printf("%s
    ", dest);
    101 
    102     getchar();
    103     getchar();
    104     return 0;
    105 }

    9.16

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 int format( char *format_string, char const *digit_string )
     5 {
     6     int formatlen = strlen(format_string);
     7     int digitlen = strlen(digit_string);
     8     int i, j, k;
     9     char *p = NULL;
    10 
    11     if (formatlen < digitlen)
    12         return 0;
    13     if ((*digit_string) == '')
    14         return 0;
    15 
    16     if ((p = strchr(format_string, '.')) != NULL)
    17     {
    18         if ((k = formatlen - (p - format_string)) > digitlen)
    19         {
    20             for (i = formatlen, j = digitlen; j >= 0; i--, j--, k--)
    21             {
    22                 *(format_string + i) = *(digit_string + j);
    23             }
    24 
    25             for (; k > 0; i--, k--)
    26             {
    27                 *(format_string + i) = '0';
    28             }
    29 
    30             if ( (*(format_string + i) == '.') )
    31             {
    32                 i--;
    33                 *(format_string + i) = '0';
    34             }
    35 
    36             for (i--; i >= 0; i--)
    37             {
    38                 *(format_string + i) = ' ';
    39             }
    40         }
    41         else
    42         {
    43             for (i = formatlen, j = digitlen; j >= 0; i--, j--)
    44             {
    45                 if ( (*(format_string + i) == ',') 
    46                     || (*(format_string + i) == '.') )
    47                     i--;
    48                 *(format_string + i) = *(digit_string + j); 
    49             }
    50             for (; i >= 0; i--)
    51                 *(format_string + i) = ' ';
    52         }
    53     }
    54 
    55     return 1;
    56 }
    57 
    58 int main (void)
    59 {
    60     char formats[] = "###,###.#####";
    61     char const digits[] = "123";
    62 
    63     printf("%s
    ", formats);
    64     printf("%s
    ", digits);
    65     if (format(formats, digits))
    66         printf("%s
    ", formats);
    67     else
    68         printf("Data error!
    ");
    69 
    70     getchar();
    71     return 0;
    72 }

    9.17

  • 相关阅读:
    16--Box2D使用(二、显示物理世界)
    15--Box2D使用(一、创建物理世界)
    14--物理引擎Box2D
    13--游戏存档
    12--使用背景音乐
    11--瓦片地图(一)简单实用
    border
    LESS
    jquery Ajax
    解决跨域访问
  • 原文地址:https://www.cnblogs.com/microxiami/p/5028217.html
Copyright © 2020-2023  润新知