C Primer Plus(第6版)第十一章编程练习答案(待写)

11.13编程练习

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

#include 
void getInput(char * arr, int size);

int main(void)
{
    char arr[10];

    getInput(arr, 10);
    puts(arr);
    
    return 0;
}
void getInput(char * arr, int size)
{
    char ch;
    int count = 0;

    while (((ch = getchar()) != '\n') && count < size)
    {
        *arr++ = ch;
        count++;
    }

    return;
}

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

#include 
#include 
void getInput(char * arr, int size);

int main(void)
{
    char arr[10];

    getInput(arr, 10);
    puts(arr);

    return 0;
}
void getInput(char * arr, int size)
{
    char ch;
    int count = 0;

    while ((!isblank(ch = getchar())) && count < size)
    {
        *arr++ = ch;
        count++;
    }

    return;
}

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

#include 
#include 
void getWord(char * arr);

int main(void)
{
    char arr[10];

    getWord(arr);
    puts(arr);

    return 0;
}
void getWord(char * arr)
{
    char ch;

    while (!isblank(ch=getchar()))
        *arr++ = ch;
    // 清空缓冲
    while (getchar() != '\n')
        continue;

    return;
}

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

#include 
#include 
void getWord(char * arr, int size);

int main(void)
{
    char arr[10];

    getWord(arr, 3);
    puts(arr);

    return 0;
}
void getWord(char * arr, int size)
{
    char ch;
    int count = 0;

    while ((!isblank(ch=getchar())) && count < size)
    {
        *arr++ = ch;
        count++;
        printf("count : %d \n", count);
    }
    // 清空缓冲
    while (getchar() != '\n')
        continue;

    return;
}

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

#include 
#include 
char * my_strchar(char * str, char * val);

int main(void)
{

    char * str1 = "abcdef";
    char * str2 = "bcd";
    my_strchar(str1, str2);

    char * get_p = my_strchar(str1, str2);

    puts(get_p);
    return 0;
}

char * my_strchar(char * str, char * val)
{
    char * p_str = str;
    char * p_val = val;
    char * ret;
    int isEqual = 0; // 不相等为0 相等为1

    while ((*p_str != '\0') && (*p_val != '\0'))
    {
        if (*p_str == *p_val)
        {
            isEqual = 1;
            
            if (isEqual == 1)
            {
                p_val++;
                p_str++;
            }
        }
        else
            str
    }

    if (isEqual == 0)
        ret = NULL;

    return ret;
}

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

#include 
#include 
int is_within(char ch, char *str);

int main(void)
{
    char * str = "abcdef";
    char ch;
    int state = 0;
    while (scanf("%c", &ch)== 1 )
    {
        while (getchar() != '\n')
            continue;
        state = is_within(ch, str);

        printf("%d", state);
        printf("¥¥¥¥¥¥¥¥ \n");
    }

    return 0;
}
int is_within(char ch, char *str)
{
    bool is_in = false;

    while (*str) // 括号内不能写成(*str++)因为副作用会完成
    {
        if (ch == *str)
            is_in = true;

        str++;
    }

    return is_in;
}

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

void mystrncpy(char *target, char *source, int num)
{

    for (int i = 0; i < num; i++)
        target[i] = source[i];

    return 0;
}

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

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

#include 
#include 
#include 
char * Reverse(char *str);

int main(void)
{
    char * str = "abcdefg";
    char * rel = Reverse(str);
    puts(rel);

    return 0;
}

char *Reverse(char *str)
{
    int n = strlen(str);
    char *temp = (char*)malloc(sizeof(char) * (n + 1));

    for (int i = 1; *str; i++)
    {
        temp[n-i] = *str++;
    }

    return temp;
}

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

char *delete_space(char *str)
{
    char temp[SIZE];
    int i = 0;
    int j = 0;

    for (i; i < SIZE; i++)
    {
        if (str[i] != SPACE)
        {
            temp[j++] = str[i];
        }
    }


    return temp;
}

11.编写一个函数,读入10个字符串或者读到EOF时停止。该程序为用户提供一个有5个选项的菜单:打印源字符串列表、以ASCII中的顺序打印字符串、按长度递增顺序打印字符串、按字符串中的第一个单词的长度打印字符串、退出。菜单可以循环显示,除非用户选择退出选项。当然,该程序要能真正完成菜单各中选项的功能。
12.编写一个程序,读取输入,直到读到EOF,报告读入的单词数、大写字母数,小写字母数、标点符号数和数字字符数。使用ctype.h头文件中的函数。
13.编写一个程序,反序显示命令行参数的单词。例如,命令行参数是see you later,该程序应该打印later see you。
14.编写一个通过命令行运行的程序计算幂。第1个命令行参数是double类型的数,作为幂的底数,第2个参数是整数,作为幂的指数。
15.使用字符分类函数实现atoi()函数。如果输入的字符串不是纯数字,该函数返回0。
16.编写一个程序读取输入,直到读取文件结尾,然后把字符串打印出来。该程序识别和实现下面的命令行参数:
-p 按原样打印
-u 把输入全部转换成大写
-l 把输入全部转换成小写
如果没有命令行参数,则让程序像是使用了-p参数那样运行。

你可能感兴趣的:(C,answer,C,Primer,Plus答案)