c语言字符数组减单引号06,C语言笔记06_字符、字符数组

C语言笔记 06

本文涉及《啊哈C》第七章内容。

1.字符的妙用

我们已经知道,存储整数可以用int,存储小数用float,存储单个字符可以用char。

我们用char a;定义一个字符变量a,用scanf("%c",&a);来从键盘读取一个字符并存放在变量a中,用printf("%c",a);来输出变量a中的字符。下面这段代码就是从键盘读入一个字符并将其输出:

char a;

scanf("%c",&a);

printf("你刚才输入的字符是%c",a);

如何给一个字符变量赋值呢?很简单:

char a;

a='x';

或直接写成:

char a='x'; // 注意!x两边是单引号!

注意了!

'1',1,"1"一样吗?当然不一样!

第一个是字符,带单引号;

第二个是整数1;

第三个是字符串,带双引号。

了解之后我们现在来做一个简单的计算器:用户可以输入a+b,a-b,a*b,a/b中的任一形式,我们的程序可以自动识别此时是要进行加法运算、减法运算、乘法运算还是除法运算。

完整代码如下:

#include #include int main()

{

int a,b;

char c;

scanf("%d%c%d",&a,&c,&b);

if(c=='+')

printf("%d",a+b);

if(c=='-')

printf("%d",a-b);

if(c=='*')

printf("%d",a*b);

if(c=='/')

printf("%d",a/b);

system("pause");

return 0;

}

2.多余的回车键

下面介绍读入字符的另一种写法:

char a;

a=getchar();

这与下面的代码是等价的:

char a;

scanf("%c",a);

b22940d6f9f69f3de7b38ffee93374d1.png

下面介绍getche()就可以满足这个要求,请看下面的代码:

#include #include int main()

{

char a;

a=getche();

printf("你刚才输入的字符是%c",a);

system("pause");

return 0;

}

程序运行后,我们按下字母x后不需要再按Enter回车键,计算机就马上告诉我们"x你刚才输入的字符是x"。

我们还要介绍getch(),输入下面代码运行:

#include #include int main()

{

char a;

a=getch();

printf("你刚才输入的字符是%c",a);

system("pause");

return 0;

}

你会发现,我们按下字母x后,计算机马上显示“你刚才输入的字符是x”,而不是“x你刚才输入的字符是x”,也就是说getch( )与getcha( )的区别就是输入的内容不会被显示在printf的内容前。(通俗语言理解)

总结一下3者区别:

语句

功能

getchar()

读取一个字符,输入后等待用户按"Enter"键结束(带回显)

getche()

读取一个字符,输入后立即获取字符,不用按"Enter"键结束(带回显)

getch()

读取一个字符,输入后立即获取字符,不用按"Enter"键结束(不带回显)

3.字符的本质

我们输入以下代码运行看看结果:

#include #include int main()

{

int i;

for(i=1;i<=128;i++)

printf("%d %c\n",i,i);

system("pause");

return 0;

}

运行:

e7c61eb16dfbc94e9b56d56a4d312d15.png

看不清楚?看下图:

d3e19a9f3e01a343210c865c2f4555aa.png

40d6cb2131809dcb6fced5920eceeffa.png

4.人名怎么储存?

4a47609e44fe5d6882a9db0d67f919ef.png

de8b68c49b907d90a75de42dc0975b2d.png

#include #include int main()

{

char a[10];

scanf("%s",a);

printf("%s",a);

system("pause");

return 0;

}

7e26173fdfddf9ff1796b29b5bd9e935.png

9bf4ecbbb7624cd5b716d6159975e16e.png

063a744db392b020ee77fe4a78300b26.png

bedf21da16954bf2a6e012fdd2bc9548.png

#include #include int main()

{

char a[101],b[101];

int x,y;

scanf("%s",a);

scanf("%d",&x); // 上文打印有误

scanf("%s",b);

scanf("%d",&y); // 上文打印有误

if(x>y)

printf("%s",a);

else

if(x

gets( )

读取字符串,除了scanf外还有gets,用法如下:

char a[101];

gets(a);

比较下面两组代码片段,说说他们的区别:

代码A:

char a[10];

scanf("%s",a);

printf("%s",a);

运行:

输入:Tom Smith

输出:Tom

代码B:

char a[10];

gets(a);

printf("%s",a)

运行:

输入:Tom Smith

输出:Tom Smith

1ed864c9cb9ab5457b8748cd9163c286.png

5.逻辑挑战16:字母的排序

现在我们要为一段字母按照字母表顺序排列:

如输入:

dzapytrbtc

则输出:

abcdprttyz

bb52cfce32c7633ae57b3a5460704c83.png

#include #include int main()

{

char a[101],t;

int len,i,j;

gets(a); //输入字符串

len=strlen(a); //获取输入字符的字符长度,方便后面控制for循环的次数

for(i=0;i<=len-2;i++) // 最后一个字母不用再往下比较,所以到len-2结束

{

for(j=i+1;j<=len-1;j++) // 只需要该字母后面的所有字母比较,不用与前面的比较,所以j=i+1而不是从j=0开始

{

if(a[i]>a[j]) // 比较字母在ASCII码表中的位置

{ t=a[i]; a[i]=a[j]; a[j]=t; }

}

}

puts(a); // 输出

system("pause");

return 0;

}

6.逻辑挑战:字典序

908399230554e136103c7d5f869c2174.png

cfbaff97838fac991a74d28e214c58ea.png

完整代码如下 (现在懒就不手打了⊙﹏⊙原谅我~):

720c32e4af73b0a821135478ad4a5301.png

7.多行字符

之前我们学习了如何储存一行字符,但如果现在我们要储存5个或5000个人的名字怎么办呢?

这里我们需要使用二维字符数组,其实和我们在前面学习的普通二维数组差不多:

char a[5][11];

上面的语句就定义了一个二维的字符数组,这个字符数组有5行,每行有11列,也就是说可以存储5个长度不超过10的字符串(想一想为什么不是长度不超过11的字

符串,不记得可以翻看前面内容)。

大概是这个样子:

1a1e7e51bc1cd12d1ad376c2f03f1e1c.png

下面的代码就是读入5行字符串,然后将这5行字符串原封不动地输出。请注意在输入时每行字符串不要超过10个字符:

char a[5][11];

int i;

for(i=0;i<=4;i++)

gets(a[i]);

for(i=0;i<=4;i++)

puts(a[i]);

我们现在来解决另一个问题,输入5个单词,让这5个单词按照字典序输出。

例如,我们输入:

book

books

cat

dog

apple

需要输出:

apple

book

books

cat

dog

这几个单词都没有超过10个字符,所以我们可以用刚刚那段代码来输入输出单词,然后就是我们用过好几次的排序代码了(要记住哦(__) ):

for(i=0;i<=3;i++)

{

for(j=i+1;j<=4;j++)

{

if(a[i]>a[j])

{ t=a[i] ; a[i]=a[j] ; a[j]=t; }

}

}

不过由于这里不是整数或字符,而是字符串。所以a[i]=a[j];并不能把字符串a[j]的内容赋值给a[i],而需要用到一个复制函数:strcpy( )

strcpy(a[i],a[j]);

作用就是把字符串a[j]的内容原封不动地复制到字符串a[i]中,从而替代掉原来字符串a[i]中的内容。

使用这个函数需要在程序最开始加上:

include

另外,字符串的比较不能用a[i]>=a[j];而用之前提到的字符串比较函数:

strcmp(a[i],a[j])

返回值

字典序

<0

a在b前面

>0

a在b后面

=0

a和b是同一个字母

那么我们的选择排序就变成了:

for(i=0;i<=3;i++)

{

for(j=i+1;j<=4;j++)

{

if(strcmp(a[i],a[j])>0)

{

strcpy(t,a[i]);

strcpy(a[i],a[j]);

strcpy(a[j],t);

}

}

}

完整代码为:

#include #include #include int main()

{

char a[5][11],t[11];

int i,j;

for(i=0;i<=4;i++)

gets(a[i]);

for(i=0;i<=3;i++)

{

for(j=i+1;j<=4;j++)

{

if(strcmp(a[i],a[j])>0)

{

strcpy(t,a[i]);

strcpy(a[i],a[j]);

strcpy(a[j],t);

}

}

}

for(i=0;i<=4;i++)

puts(a[i]);

system("pause");

return 0;

}

运行:

3e5ab8c242538e620388488406e0269b.png

8.存储一个迷宫

这一节是为《啊哈C》最后一章《游戏时间到》铺垫的。

要想建立一个迷宫,就必须要知道二维数组初始化。

回顾我们之前的一维数组初始化:直接在字符串两边加双引号和花括号即可。

char a[10]={"hello"};

同样,二维数组初始化也类似:

char a[2][10]={"hello","world"};

或者写成:

char a[2][10]={"hello",

"world"};

主要就是为了直观,更加形象地表达数组初始化。

那么现在我们就可以用二维数组初始化建造一个迷宫了:

char a[7][12]={

"###########",

"#O # #####",

"# ## ## ##",

"# # # #",

"# #### ## #",

"###########"};

现在我们就可以用一个for循环和puts( )把迷宫输出到屏幕。因为有7行,但是字符数组是从0行开始的,所以循环到6即可,而每1行是一个一维字符串,因此用puts(a[i])即可,代码如下:

#include #include int main()

{

int i;

char a[7][12]={

"###########",

"#O # #####",

"# ## ## ##",

"# # # #",

"# #### ## #",

"###########"};

for(i=0;i<=6;i++)

puts(a[i]);

system("pause");

return 0;

}

运行:

594156a0cbde8e844dfe12d0f3f41d2a.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值