栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C与指针(二)第一章习题解答

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C与指针(二)第一章习题解答

ctrl-d 不是发送信号,而是表示一个特殊的二进制值,表示 EOF。

1.7

1.空白让程序更加美丽,增加可读性。

2.声明只需要编写一次,将他们放在头文件中,避免错误。

就和书的目录一样,需要时#include目录就行,然后需要的内容里面都有,尤其在大型程序时,将不同的函数分别变为模块,调用就用include,程序就会变得井井有条。

3.使用#define给字面常量取值 方便修改 增加可读性

4."%d,%s,%f"

5.       

    int quantity;
    int price;
    char department[10] = {0};
    scanf("%d %d %s",&quantity,&price,department);

6.C语言不执行下标的有效检查,

        因为C语言相信程序员,提高C语言执行效率,通过指针操作更加美丽

7.使用strcpy代替strncpy,在输出空间不够时会出问题

唯一需要注意的就是strcpy可能会复制更多的字符到字符串中,在空间不够的字符串中复制会导致内存泄漏,影响程序中其他的变量。

8while(gets(input) != NULL)

会出现的问题:input输入溢出

        使用gets()会出现问题,因为gets不检查越界,当输入的字符比之前预设的多时,gets也会继续执行,但是程序可能会出现内存泄漏的问题,在很多编译器中已经禁止使用gets函数

1.8

1

#include 
int main(int argc, char const *argv[])
{
    printf("hello worldn");
    return 0;
}

2

//从标准输入读取几行输入,每行输入都要打印到标准输出上,
//前面加上行号,试图让程序输入行的长度没有限制

#include 
#include 

int main(int argc, char const *argv[])
{
    int line = 0;
    int ch;
    int at_begining = 1;
    
    while((ch = getchar()) != EOF) 
    {
        if(at_begining == 1)
        {
            at_begining = 0;
            line+=1;
            printf("%d:",line);
        }
        putchar(ch);
        if(ch == 'n')
        {
            at_begining = 1;
        }
    }
    
    return EXIT_SUCCESS;
}

 3

//从标准输入读取一些字符,写到标准输出,同时检查checksum,写在字符后面

//checksum(验证) 用一个signed char类型变量进行计算,初始为-1,

//当每个字符从标准输入读取时,他的值被加入到checksum中,如果checksum产生

//溢出,这些溢出被忽略,当所有字符被写入后,程序以十进制整数形式打印checksum

//它有可能是负值,注意在checksum后加一个换行符

#include 
int main(int argc, char const *argv[])
{
    signed char checksum = -1;
    signed char ch;
    while((ch = getchar())!= 'n')
    {
        putchar(ch);
        checksum+= ch;
    }
    checksum+=ch;
    putchar('n');
    printf("%dn",checksum);
    return 0;
}
Hello world!
Hello world!
102

 4.

//一行行读取输入,直至达到文件末尾。

//算出每行输入行的长度,把最长的那行打印出来

//假定每行输入行不超过1000个字符

#include 
#include 
//  CRTL + D
#define MAX_STRING 1001

int main(int argc, char const *argv[])
{
    char input[MAX_STRING];
    char longest[MAX_STRING];

    int len;
    int longest_len;

    longest_len = -1;

    while(gets(input)!= NULL)
    {
        len = strlen(input);
        if(len > longest_len)
        {
            longest_len = len;
            strcpy(longest,input);
        }
    }
    if(longest >= 0)
    {
        printf("%d:%sn", longest_len,longest);
    }
    return 0;
}

 1.5当输入行已满,必须终端循环,在其他情况下继续

同时检查每个范围内复制了多少个字符,以防止一个NUL过早复制到缓冲区

#include 
#include 
#include 

#define MAX_COLS 20
#define MAX_INPUT 1000

int read_column_num(int columns[],int max);
void rearrange(char *output,char *input,int n_columns,int const columns[]);

int main(int argc, char const *argv[])
{
    int n_columns;
    int columns[MAX_COLS];
    char input[MAX_INPUT];
    char output[MAX_INPUT];

    n_columns = read_column_num(columns,MAX_COLS);

    while(gets(input) != NULL)
    {
        printf("Original input: %sn", input);
        rearrange(output,input,n_columns,columns);
        printf("Rearranged line: %sn",output);
    }
    return EXIT_SUCCESS;
    return 0;
}

int read_column_num(int columns[],int max)
{
    int num = 0;
    int ch;

    while(num < max && scanf("%d",&columns[num]) == 1 && columns[num] >= 0)
    {
        num++;
    }
    //标号为偶数
    if(num %2 != 0)
    {
        printf("the last column is not pairedn");
        exit(EXIT_FAILURE);   
    }
    while((ch = getchar())!= EOF && ch != 'n')
    {
        ;
    }
    return num;
}
void rearrange(char *output,char *input,int n_columns,int const columns[])
{
    int col; //columns数组下标
    int output_col=0; //输出列计数器
    int len; //输入数组长度

    len = strlen(input);

    for(col = 0; col < n_columns; col+=2)
    {
       
        int nchars = columns[col+1] - columns[col] +1;
        //如果输入行没这么长,跳出这个范围
        if( columns[col]>=len)
        {
            continue;
        } 
        //或者  输出数组已满,结束任务
        if(output_col == MAX_INPUT-1)
        {
            break;
        }
        //如果输出行数据不够,只复制可以容纳的
        if(output_col + nchars > MAX_INPUT-1)
        {
            nchars = MAX_INPUT -1 - output_col;
        }
        if(columns[col] + nchars -1 >= len )
        {
            nchars = len - columns[col];
        }
        //复制相关数据
        strncpy(output+output_col,input+columns[col],nchars);
        output_col += nchars;
    }
        output[output_col] = '';
}

 1.8.6

题目看不懂

中文版太难懂了

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1029512.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号