------Java培训、Android培训、iOS培训、.Net培训 期待与您交流!-------
本篇将要通过一道简单的C语言小程序题来引入今天的主题:宏定义、数组、字符串和函数。下面先来看看我们的题目吧
* 从键盘输入一大堆字符串,统计A、B、C、D的出现次数,最后出现次数由高到低输出字母和出现次数。
这道题在我看来可以分为三大功能模块:输入字符串、统计次数、排序并输出,这就决定了我们主函数的结构
先来看看代码头
#include
#include
#define M 100
#define N 4
include是包含程序中需要用到的函数的头文件
关于define这是预处理指令中的宏定义
本题使用的是它不带参数的定义
#define 宏名 字符串(注意:结尾不用【;】)
也就是在程序中我们使用宏名来表示右面的字符串内容,宏定义其实就是在程序运行前编译的时候,将宏名替换成右边的字符串,再进行后续操作,个人感觉这是最常见的一种使用方式,说到这里再介绍另外一种宏定义的使用方法:带参数的宏定义
下面的代码与题目无关,只是作为一个宏定义使用方法的补充
#include
#define TEST(a) a * a
int main()
{
int r = TEST(2+2);
printf("%d\n",r);
}
但是这个宏定义是有问题的,如果变成 TEST(2+2),结果却不是16,而是8,这是因为宏定义是是纯粹的替换,而不能像函数一样能帮你做计算,TEST(2+2)被替换成2+2 * 2+2,结果自然是8,所以在定义时需要给变量套上 (),但这样也还是不够的,还要给结果也加上()
改进后的代码 (下面的代码与题目无关)
#include
#define TEST(a) ((a) * (a))
int main()
{
int r = TEST(5+5)/TEST(2+3);//这样可以测出宏定义结果的正确性
printf("%d\n",r);
}
回到我们的题目,下面是main函数中的代码,对应上面所述,分成了三大模块
int main()
{
int count[N] = {0};
//定义接收从屏幕输入的字符串变量,并分配存储空间
char *input = (char *) malloc(M);
printf("请输入字符串:\n");
//gets()函数会报warning,但是这里要接收空格,所以还是使用了
gets(input);
//调用统计函数
Statistics(input,count);
//调用排序函数
Sort(count);
return 0;
}
从这段代码中就可以找到我们今天的主题:数组、字符串和函数,下面我们分开来简单讲讲他们的用法。
int main()
{
char *input = "";
input = "hello world";
printf("%s\n",input);
return 0;
}
char input[100] = {}; ,由于没有‘\0’,会从起始地址开始一个一个输出字符,直到遇见'\0'为止。但如果这么写,char input[100] = {‘\0’},这样没问题了。
本段代码中,这一句代码 char *input = (char *) malloc(M); 这是因为如果定义一个字符串变量来接收从屏幕输入的字符串,它此时还没有分配存储空间,无法使用,所以通过这句给它分配存储空间,这样后面的使用就完全没有问题了,因为malloc这个函数,包含了stdlib.h。
还有一点需要注意的:计算字符串长度(指的是字节数,而非字数,比如1个汉字占3个字节,它的长度是3而不是1)
sizeof() 输出字符串内所有的字节数,包括'\0'
strlen() 输出字符串内所有的字符数,不包括'\0'
//统计函数的声明
void Statistics(char *in,int c[]);
//排序函数声明
void Sort(int c[]);
默认情况下,是外部函数(extern),也就是其他文件也可以使用,如果限制于本文件使用需要在void前面加上关键字 static
void test(int a)
{
}
传入的参数是基本数据类型,这是进行了值传递,既只是把原来变量的值传递给实参,改变这个值,原来变量的值并不会被修改。
//统计函数:从输入的字符串中,统计A、B、C、D的出现次数
void Statistics(char *in,int c[])
{
//遍历字符串
while (*in != '\0')
{
//统计A、B、C、D的出现次数
if (*in >= 'A' && *in <= 'D')
{
c[*in - 'A']++;
}
in++;
}
}
//排序函数:由高到低排序,并输出
void Sort(int c[])
{
//定义排序的结构体类型
struct NewSort
{
char c;
int times;
};
//定义结构体变量
struct NewSort out[N];
//对结构体变量进行赋值
for (int i = 0; i < N; i++)
{
out[i].c = 'A' + i;
out[i].times = c[i];
}
//由大到小排序(冒泡排序)
for (int i = 0; i < N; i++)
{
for (int j = i + 1; j < N; j++)
{
if (out[j].times > out[i].times)
{
struct NewSort t;
t = out[j];
out[j] = out[i];
out[i] = t;
}
}
}
//输出排序后的字母及其出现次数
for (int i = 0; i < N; i++) {
printf("%c\t%d\n",out[i].c,out[i].times);
}
}