成成你好呀(C知识点整理四)
作者:互联网
[知识点备忘] 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 *)#
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