c primer plus第十一章课后习题

1.

void input(char * p, int n) 
{
    int i;

    for(i = 0; i < n; i++)
        *(p + i) = getchar() ;
    *(p + i) = '\0';
}

2.

void input(char * p, int n) 
{
    int i;

    for(i = 0; i < n; i++)
        *(p + i) = getchar() ;
    if(isspace(*(p + i)))
        break;
    *(p + i) = '\0';
}

3.

void word(char * p)
{
    int begin, end;

    for(begin = 0; isspace(*(p + begin)); begin++)
        continue;
    for(end = begin; !isspace(*(p + end)); end++)
        continue;
    *(p + end) = '\0';
    for(;*(p + begin) != '\0'; p++)
        *p = *(p + begin);
    *p = '\0';
}

4.

char *mystrchr(char *p, char ch)
{
    char *p_save = p;
    if(*p == '\0')
        return NULL;
    while(1)
    {
        if(*p == ch)
        {
            return p_save;
        }
        else
        {
            if(*++p == '\0')
                return NULL;
            p_save = p;
        }
    }
}

5.

int is_within(char *p, char ch)
{
    while(*p != '\0')
    {
        if(*p == ch)
            return 1;
        p++;
    }
    return 0;
}

6.

char *strncpy(char *p1, char *p2, n)
{
    char *p = p1;
    while(n--)
    *p1++ = *p2++;
    return p;
}

7.

char *string_in(char *p1, char *p2)
{
 char *p1_save = p1, *p2_save = p2;
 if(*p1 == '\0' || *p2 == '\0') return NULL;
 while(1)
 {
  if(*p1 == *p2)
  {
   if(*++p2 == '\0') return p1_save;
   if(*++p1 == '\0') return NULL;
  }
  else
  {
   if(*++p1 == '\0') return NULL;
   p1_save = p1;
   p2 = p2_save;
  }
 }
} 

8.

void reverse(char *p)
{
    int i, n;
    char temp;
    for(n = 0; *(p + n) != '\0'; n++)
        continue;
    n--;
    for(i = 0; i < n - i; i++)
    {
        temp = p[i];
        p[i] = p[n -i];
        p[n - i] = temp;
    }
}

9.

void delspace(char *p1)
{
    char *p2;
    while(*p1 != '\0')
    {
        if(*p1 = ' ')
        {
            p2 = p1;
            while(*p2 != '\0')
            {
                *p2 = *(p2 +1);
                p2++;
            }
            p1--;
        }
        p1++;
    }
}

10.

#include <stdio.h>
#include <string.h>
#include <ctype.h>

void origin_put(char **p, int n);
void ascii_put(char **p, int n);
void length_put(char **p, int n);
int first_word_length(char *p);
void word_put(char **p, int n);

int main(void)
{
    char str[10][81];
    char *p[10];
    char command[10];
    int n;

    while(1)
    {
        n = 0;
        puts("input no more than 10 strings finished by EOF(^Z):");
        do
        {
            if(gets(str[n]) == NULL)
                break;
            p[n] = str[n];
            n++;
        }
        while(n < 10);
        puts("select:");
        puts("a. put originally");
        puts("b. put in order of ascii");
        puts("c. put in order of string's length");
        puts("d. put in order of first word's length");
        puts("e. input strings again");
        puts("q. quit");
        do
        {
            gets(command);
            switch(command[0])
            {
                case 'a': puts("put originally:");
                        origin_put(p,n);
                        break;
                case 'b': puts("put in order of ascii:");
                        ascii_put(p, n);
                        break;
                case 'c': puts("put in order of string's length:");
                        length_put(p, n);
                        break;
                case 'd': puts("put in order of first word's length:");
                        word_put(p, n);
                        break;
                case 'e': break;
                default: puts("Quit.");
                return 0;       
            }
        }
        while(command[0] != 'e');
    }
}

void origin_put(char **p, int n)
{
    int i;
    for(i = 0; i < n; i++)
        puts(p[i]);
}

void ascii_put(char **p, int n)
{
    int i, j;
    char *temp;
    for(i = 0; i < n; i++) 
        for(j = 0; j < n- i- 1; j++)
        if(strcmp(p[j], p[j+1]) > 0)
        {
            temp = p[j];
            p[j] = p[j+1];
            p[j+1] = temp;
        }
    origin_put(p,n);
}

void length_put(char **p, int n)
{
    int i,j;
    char *temp;
    for(i = 0; i<n; i++)
        for(j = 0; j<n-i-1;j++)
            if(strlen(p[j]) > strlen(p[j+1]))
            {
                temp = p[j];
                p[j] = p[j+1];
                p[j+1] = temp;
            }
    origin_put(p, n);
}

int first_word_length(char *p)
{
    int i = 0;
    for(;!isalpha(*p);p++)
        if(*p == '\0')
            return 0;
    for(i = 1; isalpha(p[i]);i++)
        continue;
    return 1;
}

void word_put(char **p, int n)
{
    int i, j;
    char *temp;
    for(i = 0; i<n; i++)
        for(j = 0; j<n-i-1; j++)
            if(first_word_length(p[j]) > first_word_length(p[j+1]))
            {
                temp = p[j];
                p[j] = p[j+1];
                p[j+1] = temp;
            }
    origin_put(p, n);
}

11.

#include <stdio.h>
#include <ctype.h>

int main(void)
{
    int word = 0, upper = 0, lower = 0, punct = 0, digit = 0, begin =0;
    char ch;

    while((ch = getchar()) != EOF )
    {
        if(isalpha(ch))
        {
            if(begin = 0)
            {
                word++;
                begin =1;
            }
        }
        else(begin =0);
        if(isupper(ch))
            upper++;
        if(islower(ch))
            lower++;
        if(ispunct(ch))
            punct++;
        if(isdigit(ch))
            digit++;
    }
    printf("word:%d\nupper:%d\nlower:%d\npunct:%d\ndigit:%d\n", word, upper, lower, punct, digit);
    return 0;
}

12.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值