ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

成成你好呀(C知识点整理四)

2021-05-02 16:59:01  阅读:141  来源: 互联网

标签:知识点 成成 ## ++ char int num printf 你好


[知识点备忘] S1E26:指向指针的指针

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

[课后作业] S1E26:指向指针的指针 | 课后测试题及答案

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include <stdio.h>

int main()
{
        char str[1024];
        char *p = str;          // 用于间接寻址
        char *pos[1024] = {0};  // 记录每个单词的地址
        int len = 0;
        int cChar = 0, cWord = 0; // cChar 统计字符数, cWord 统计单词数
        int max = 0, i = 0, j;

        printf("请输入一个英文句子:");
        // 接收输入,顺带统计用户实际输入了多少个字符
        while ((str[len++] = getchar()) != '\n' && len + 1 < 1024)
                ;
        str[len-1] = '\0'; // str[len]存放的是'\n',将其替换为'\0'

        if (*p != ' ')
        {
                pos[i++] = p; // 记录第一个单词的地址
                cWord++;
        }

        while (len--)
        {
                if (*p++ == ' ')
                {
                        // 判断最大字符数
                        max = cChar > max ? cChar : max;
                        cChar = 0;

                        // 到底了,退出循环
                        if (*p == '\0')
                        {
                                break;
                        }

                        // 单词数加一
                        if (*p != ' ')
                        {
                                pos[i++] = p;
                                cWord++;
                        }
                }
                else // 没有else会把空格统计进去
                {
                        cChar++;
                }
        }
        max = --cChar > max ? cChar : max; // 最后会算多一个'\0',所以减去

        // 申请可变长数组,max+1,否则'\0'放不下
        char result[cWord][max+1];

        // 将分割好的单词放进二维数组里
        for (i = 0; i < cWord; i++)
        {
                for (j = 0; *(pos[i]+j) != ' ' && *(pos[i]+j) != '\0'; j++)
                {
                        result[i][j] = *(pos[i]+j);
                }
                result[i][j] = '\0';
        }

        // 打印结果
        printf("分割结果已存放到result[%d][%d]的二维数组中...\n", cWord, max+1);
        printf("现在依次打印每个单词:\n");
        for (i = 0; i < cWord; i++)
        {
                printf("%s\n", result[i]);
        }

        return 0;
}

在这里插入图片描述

1. 修改代码,使得程序允许用户指定分隔符。

#include <stdio.h>

int main()
{
        char str[1024];
        char *p = str;          // 用于间接寻址
        char *pos[1024] = {0};  // 记录每个单词的地址
        int len = 0;
        int cChar = 0, cWord = 0; // cChar 统计字符数, cWord 统计单词数
        int max = 0, i = 0, j;
        char delim = ' ';

        printf("请输入一个英文句子:");
        // 接收输入,顺带统计用户实际输入了多少个字符
        while ((str[len++] = getchar()) != '\n' && len + 1 < 1024)
                ;
        str[len-1] = '\0'; // str[len]存放的是'\n',将其替换为'\0'

        printf("请输入分割符:");
        scanf("%c", &delim);

        if (*p != delim)
        {
                pos[i++] = p; // 记录第一个单词的地址
                cWord++;
        }

        while (len--)
        {
                if (*p++ == delim)
                {
                        // 判断最大字符数
                        max = cChar > max ? cChar : max;
                        cChar = 0;

                        // 到底了,退出循环
                        if (*p == '\0')
                        {
                                break;
                        }

                        // 单词数加一
                        if (*p != delim)
                        {
                                pos[i++] = p;
                                cWord++;
                        }
                }
                else // 没有else会把空格统计进去
                {
                        cChar++;
                }
        }
        max = --cChar > max ? cChar : max; // 最后会算多一个'\0',所以减去

        // 申请可变长数组,max+1,否则'\0'放不下
        char result[cWord][max+1];

        // 将分割好的单词放进二维数组里
        for (i = 0; i < cWord; i++)
        {
                for (j = 0; *(pos[i]+j) != delim && *(pos[i]+j) != '\0'; j++)
                {
                        result[i][j] = *(pos[i]+j);
                }
                result[i][j] = '\0';
        }

        // 打印结果
        printf("分割结果已存放到result[%d][%d]的二维数组中...\n", cWord, max+1);
        printf("现在依次打印每个单词:\n");
        for (i = 0; i < cWord; i++)
        {
                printf("%s\n", result[i]);
        }

        return 0;
}

在这里插入图片描述

[知识点备忘] S1E27:常量和指针

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

[课后作业] S1E27:常量和指针 | 课后测试题及答案

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

0. 相信你已经知道什么是大端和小端了(如果还不清楚请戳 -> 传送门),现在请编写一个程序,测试一下你当前的计算机是大端还是小端?

#include <stdio.h>

int main(void)
{
        int num = 0x12345678;
        unsigned char *p = (unsigned char *)&num;

        if (*p == 0x78)
        {
                printf("您的机器采用小端字节序。\n");
        }
        else
        {
                printf("您的机器采用大端字节序。\n");
        }

        printf("0x12345678 在内存中依次存放为:0x%x 0x%x 0x%x 0x%x\n", p[0], p[1], p[2], p[3]);

        return 0;
}

[知识点备忘] S1E28:函数初体验

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述
6. 补充:如果函数不需要参数,建议定义时在函数名后边的小括号中写上 void,明确表示该函数无参数。

[课后作业] S1E28:函数初体验 | 课后测试题及答案

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述在这里插入图片描述

0. 代码清单:

#include <stdio.h>

void print_F();
void print_I();
void print_S();
void print_H();
void print_C();

int main()
{
        print_F();
        printf("\n");
        print_I();
        printf("\n");
        print_S();
        printf("\n");
        print_H();
        printf("\n");
        print_C();
        printf("\n");

        return 0;
}

void print_F()
{
        printf("########\n");
        printf("##      \n");
        printf("##      \n");
        printf("######  \n");
        printf("##      \n");
        printf("##      \n");
        printf("##      \n");
}

void print_I()
{
        printf("####\n");
        printf(" ## \n");
        printf(" ## \n");
        printf(" ## \n");
        printf(" ## \n");
        printf(" ## \n");
        printf("####\n");
}

void print_S()
{
        printf(" ###### \n");
        printf("##    ##\n");
        printf("##      \n");
        printf(" ###### \n");
        printf("      ##\n");
        printf("##    ##\n");
        printf(" ###### \n");
}

void print_H()
{
        printf("##    ##\n");
        printf("##    ##\n");
        printf("##    ##\n");
        printf("########\n");
        printf("##    ##\n");
        printf("##    ##\n");
        printf("##    ##\n");
}

void print_C()
{
        printf(" ###### \n");
        printf("##    ##\n");
        printf("##      \n");
        printf("##      \n");
        printf("##      \n");
        printf("##    ##\n");
        printf(" ###### \n");
}

1. 代码清单:

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

#define HEIGHT 7  // 根据下面定义,每个字母高度均是7行

const char *letters[] = {
"\
\########@\
\##      @\
\##      @\
\######  @\
\##      @\
\##      @\
\##      @\
",
"\
\####@\
\ ## @\
\ ## @\
\ ## @\
\ ## @\
\ ## @\
\####@\
",
"\
\ ###### @\
\##    ##@\
\##      @\
\ ###### @\
\      ##@\
\##    ##@\
\ ###### @\
",
"\
\##     ##@\
\##     ##@\
\##     ##@\
\#########@\
\##     ##@\
\##     ##@\
\##     ##@\
",
"\
\ ###### @\
\##    ##@\
\##      @\
\##      @\
\##      @\
\##    ##@\
\ ###### @\
"
};

int main()
{
        int i, j;
        int gap;

        printf("请输入字母的间隔(空格数):");
        scanf("%d", &gap);

        // 一行一行打印
        for (i = 0; i < HEIGHT; i++)
        {
                // 打印所有字母的某一行
                for (j = 0; j < 5; j++)
                {
                        // k 用于迭代每一行的‘#’字符
                        int k = 0;
                        // 计算出该字母每一行有多少个字符
                        int len = strlen(letters[j]) / HEIGHT;
                        // 计算当前打印第几行
                        int line = i * len;

                        // @标志着该行结束
                        while (letters[j][line+k] != '@')
                        {
                                putchar(letters[j][line+k]);
                                k++;
                        }

                        // 打印字母间的间隔(空格)
                        int temp = gap;
                        while (temp--)
                        {
                                putchar(' ');
                        }
                }
                putchar('\n');
        }

        return 0;
}

[知识点备忘] S1E29:参数和指针

在这里插入图片描述
在这里插入图片描述

#include <stdio.h>
#include <stdarg.h>

int sum(int n, ...);

int sum(int n, ...) // 三个小点是占位符,表示参数个数不确定
{
        int i, sum = 0;
        va_list vap; // 定义参数列表

        va_start(vap, n); // 初始化参数列表,如果是 int sum(int gg, ...); 则这里应该是 va_start(vap, gg);
        for (i = 0; i < n; i++)
        {
                sum += va_arg(vap, int); // 获取参数值
        }
        va_end(vap); // 首尾工作,关闭参数列表

        return sum;
}

int main()
{
        int result;

        result = sum(3, 1, 2, 3);

        printf("result = %d\n", result);

        return 0;
}

在这里插入图片描述

[课后作业] S1E29:参数和指针 | 课后测试题及答案

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

*0. 你应该听说过 itoa 函数(函数文档 -> 传送门),它的作用是将一个整数转换成字符串形式存储。现在要求我们自己来实现一个类似功能的函数 myitoa(int num, char str),该函数的第一个参数是待转换的整型变量,第二参数传入一个字符指针,用于存放转换后的字符串。

#include <stdio.h>

char *myitoa(int num, char *str);

char *myitoa(int num, char *str)
{
        int dec = 1;
        int i = 0;
        int temp;

        if (num < 0)
        {
                str[i++] = '-';
                num = -num;
        }

        temp = num;

        while (temp > 9)
        {
                dec *= 10;
                temp /= 10;
        }

        while (dec != 0)
        {
                str[i++] = num / dec + '0';
                num = num % dec;
                dec /= 10;
        }

        str[i] = '\0';

        return str;
}

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

        printf("%s\n", myitoa(520, str));
        printf("%s\n", myitoa(-1234, str));

        return 0;
}

在这里插入图片描述

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

int myprintf(char *format, ...);
int countInt(int num);
void printInt(int num);
void printStr(char *str);

// 这里我们使用迭代的方式打印整数
// 等后面学了递归,用递归会更方便呢
void printInt(int num)
{
        int dec = 1;
        int temp;

        if (num < 0)
        {
                putchar('-');
                num = -num;
        }

        temp = num;

        while (temp > 9)
        {
                dec *= 10;
                temp /= 10;
        }        

        while (dec != 0)
        {
                putchar(num / dec + '0');
                num = num % dec;
                dec /= 10;
        }
}

// 计算整数占多少个字符
int countInt(int num)
{
        int count = 0;

        if (num < 0)
        {
                count++;
                num = -num;
        }

        do
        {
                count++;
        } while (num /= 10);

        return count;
}

void printStr(char *str)
{
        int i = 0;

        while (str[i] != '\0')
        {
                putchar(str[i]);
                i++;
        }
}

int myprintf(char *format, ...)
{
        int i = 0;
        int count = 0;
        int darg; 
        char carg;
        char *sarg; 
        va_list vap;

        va_start(vap, format);

        while (format[i] != '\0')
        {
                // 如果不是格式化占位符,直接打印字符串
                if (format[i] != '%')
                {
                        putchar(format[i]);
                        i++;
                        count++;
                }
                // 如果是格式化占位符...
                else
                {
                        switch (format[i+1])
                        {
                                case 'c':
                                        {
                                                carg = va_arg(vap, int);
                                                putchar(carg);
                                                count++;
                                                break;
                                        }
                                case 'd':
                                        {
                                                darg = va_arg(vap, int);
                                                printInt(darg);
                                                count += countInt(darg);
                                                break;
                                        }
                                case 's':
                                        {
                                                sarg = va_arg(vap, char *);
                                                printStr(sarg);
                                                count += strlen(sarg);
                                                break;
                                        }
                        }
                        i += 2;
                }
        }

        va_end(vap);

        return count;
}

int main(void)
{
        int i;

        i = myprintf("Hello %s\n", "FishC");
        myprintf("共打印了%d个字符(包含\\n)\n", i);
        i = myprintf("int: %d, char: %c\n", -520, 'H');
        myprintf("共打印了%d个字符(包含\\n)\n", i);
        
        return 0;
}

标签:知识点,成成,##,++,char,int,num,printf,你好
来源: https://blog.csdn.net/weixin_43144288/article/details/116352674

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有