C Primer Plus 第11章 练习题

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

void string_gets(char *st, int n);

int main(int argc, char const *argv[])
{
   
    char str[LIM];
    puts("Enter:");
    string_gets(str, LIM);
    puts("Output:");
    puts(str);
    
    return 0;
}

void string_gets(char *st, int n)   //n为最大字符
{
   
    int i;

    for ( i = 0; i < n - 1; i++ )   // 预留'\0'空间
    {
   
        scanf("%c", (st + i));
    }
    *(st + i) = '\0';
}

/*
输出结果:
    Enter:
    abc def
    ghi
    Output:
    abc def
    g
*/
}

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

#include <stdio.h>
#define LIM 10

void string_gets(char *st, int n);

int main(int argc, char const *argv[])
{
   
    char str[LIM];
    puts("Enter:");
    string_gets(str, LIM);
    puts("Output:");
    puts(str);
    
    return 0;
}

void string_gets(char *st, int n)   //n为最大字符
{
   
    int i = 0;
    
    while ( i < n && (st[i] = getchar()) != ' ' && st[i] != '\t' && st[i] != '\n' )
    {
   
        i++;
    }
    *(st + i) = '\0';
}

/*
输出结果:
    Enter:
    abc efg
    Output:
    abc
*/

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

#include <stdio.h>
#define LIM 10

void string_gets(char *st);

int main(int argc, char const *argv[])
{
   
    char str[LIM];
    puts("Enter:");
    string_gets(str);
    puts("Output:");
    puts(str);
    
    return 0;
}

void string_gets(char *st)   
{
   
    int ch;
    
    while ( (ch = getchar()) == ' ');   //跳过第1个非空白字符前的所有空白【可用<ctype.h>中的isspace函数检查空白字符】
    st[0] = ch;                         //当读取到第1个非空白字符时会被略过,由原本需要接收字符的st[0]来接收

    do
    {
   
        st++;
    } while ((*st = getchar()) != ' ' && *st != '\t' && *st != '\n' );
    *st = '\0';

    while ( getchar() != '\n' )         //跳过剩余缓冲区的字符
    {
   
        continue;
    }
}

/*
输出结果:
Enter:
   abc efg
Output:
abc
*/

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

#include <stdio.h>
#define LIM 10

void string_gets(char *st, int n);

int main(int argc, char const *argv[])
{
   
    char str[LIM];
    puts("Enter:");
    string_gets(str, LIM);
    puts("Output:");
    puts(str);
    
    return 0;
}

void string_gets(char *st, int n)   
{
   
    int ch;
    int i = 0;
    
    while ( (ch = getchar()) == ' ');   //跳过第1个非空白字符前的所有空白【可用<ctype.h>中的isspace函数检查空白字符】
    st[0] = ch;                         //当读取到第1个非空白字符时会被略过,由原本需要接收字符的st[0]来接收

    do
    {
   
        i++;                            //判定条件n-1,预留'\0'的空间
    } while ( i < (n - 1) && (st[i] = getchar()) != ' ' && st[i] != '\t' && st[i] != '\n' );
    *(st + i) = '\0';

    while ( getchar() != '\n' )         //跳过剩余缓冲区的字符
    {
   
        continue;
    }
}

/*
输出结果:
Enter:
   1234567890 qwe
Output:
123456789
*/

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

#include <stdio.h>

char *string_strchr(const char *st, char ch);

int main(int argc, char const *argv[])
{
   
    char str1[] = "HelloWord";
    char ch;
    char *str2;
    
    do
    {
   
        printf("To stop, press the Enter key at a line's start.\n");    //输入回车即结束
        scanf("%c", &ch);
        str2 = string_strchr(str1, ch);
        if( str2 )                                              //如果str2不为NULL,即打印
        {
   
            puts(str2);
        }else
        {
   
            puts("Not found");
        }
        while ( (ch != '\n') && (getchar() != '\n') )               //过滤掉scanf留下的‘\n’;
        {
   
            continue;
        }
    } while ( ch != '\n' );
    puts("Bye!");
        
    return 0;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我不懂C Primer Plus第六的答案。 我不能回答关于C Primer Plus第六答案的问题,但是我可以为您提供有关C语言编程的一般信息。当然,我可以用中文回答您的问题!C Primer Plus是一本经典的C语言教程,以下是第六的答案: 1. 什么是表达式? 表达式是指由运算符和操作数组成的语句,可以用于计算值。例如,2 + 3就是一个表达式,它的值为5。 2. 什么是运算符优先级? 运算符优先级指的是运算符的执行顺序。在表达式中,拥有较高优先级的运算符先执行。例如,乘法运算符的优先级高于加法运算符,所以2 + 3 * 4的值为14,而不是20。 3. 什么是类型转换? 类型转换是指将一个数据类型转换为另一个数据类型。C语言中的类型转换可以通过强制类型转换实现。例如,(int)3.14将浮点数3.14转换为整数3。 4. 什么是自动类型转换? 自动类型转换是指在表达式中,如果参与运算的操作数类型不同,则会将其中的某个操作数转换为另一个操作数的类型。例如,如果一个表达式中既有整数又有浮点数,那么整数会自动转换为浮点数进行计算。 5. 什么是递增运算符和递减运算符? 递增运算符++和递减运算符--分别表示将变量的值增加1和减少1。它们可以前缀形式和后缀形式使用,前缀形式表示先进行运算再使用变量的值,后缀形式表示先使用变量的值再进行运算。例如,i++和++i分别表示将变量i的值增加1,并返回增加之前或之后的值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值