C语言学习--字符和字符串

目录

1.字符

字符输入--scanf

字符输入--getchar

2.字符串

字符串输入--scanf

字符串输入--gets


1.字符

字符输入--scanf

C语言scanf输入时缓冲区问题

scanf函数是标准输入流(从键盘接收数据),接收的数据放入输入缓冲区中,其中就包括在键盘输入的空格(' ')、回车('\n')这类字符,当你用%d接收时是不会影响的,但是用%c就会产生错误,这是因为在"%c"输入时,空格和转义字符均作为有效字符会被%c接收。

#include <stdio.h>
int main()
{
	char a,b,c;
	scanf("%c%c%c",&a,&b,&c);
	printf("%c,%c,%c",a,b,c);
	return 0;
} 

大致过程:

字符输入--getchar

        getchar()函数的功能是从缓冲区中读取一个字符,注意,是一个字符。

如果缓冲区中没有字符可以读取时,getchar()就会等待我们输入一个字符,然后把它读走

如果缓冲区中存在字符,getchar()就不等我们输入,直接读取缓冲区中的字符。

与此对应的是putchar(),它能够向终端输出一个字符

#include <stdio.h>
#include <string.h>
int main()
{
	char a,b,c;
	scanf("%c%c%c",&a,&b,&c);
    char x=getchar();
	printf("%c,%c,%c\n",a,b,c);
    printf("%c\n",x);
    putchar(x);
	return 0;
} 

2.字符串

字符串输入--scanf

补充一下字符串初始化定义的几种形式:

//方式一:数组形式
    //1.指明数组长度
    //以字符形式初始化,后面会自动添0
    char str1[10]={'a','b','c','d'};
//还可以以字符串的形式赋值,而且这种可以通过数组名修改字符串
    char str2[10]={"hello"};//可以把{}省掉
    char str2[10]="hello";

//2.不指明数组长度
    char str3[]={'e','f','g','h',0};
//不会在后面自动添0,需手动添加。注意这里添的是'\0'或者0,不能是'0',
    

//方式二:指针形式
    char* str="gyp";
    char* str = (char*)malloc(100 * sizeof(char));

//注意:指针初始化的时候必须要有值,不能出现空指针的形式char* str;

字符串的输入参数是已经定义好的“字符数组名”(指针), 不用加&,因为在C语言中数组名就代表该数组的起始地址 

#include <stdio.h>
int main(){
    char str[20];  //str是string的缩写, 即字符串
    printf("请输入字符串:");
    scanf("%s", str);  /*输入参数是已经定义好的“字符数组名”, 不用加&,
                        因为在C语言中数组名就代表该数组的起始地址*/
    printf("输出的结果是:%s\n", str);
    return 0;
}

原因是用 scanf 输入带空格的字符串时系统将空格作为输入字符串之间的分隔符。也就是说,只要一“敲”空格,系统就认为当前的字符串已经结束,接下来输入的是下一个字符串,所以只会将空格之前的字符串存储到定义好的字符数组中。

解决方法:
以空格为分隔符,数有多少个字符串,有多少个字符串就定义多少个字符数组。比如“i am working”有两个空格,表示有三个字符串,那么就定义三个字符数组:

# include <stdio.h>
int main(){
    char str1[20], str2[20], str3[20];
    printf("请输入字符串:");
    scanf("%s%s%s", str1, str2, str3);
    printf("输出的结果是:%s %s %s\n", str1, str2, str3);  //%s间要加空格
    return 0;
}

字符串输入--gets

 在<string.h>头文件中

字符串输入函数gets
格式:gets(字符数组)
功能:从键盘键入以回车结束的字符串放入字符数组中,并自动加’\0’
说明:输入串长度应小于字符数组维数,字符串中可以包含空格

字符串输出函数puts
格式:puts(字符数组)
功能:向显示器输出字符串(输出完,自动换行,即用’\n’替’\0’)
说明:字符数组必须以’\0’结束

gets可以很好的解决当我们输入一个字符串的时候,scanf会因为空格结束的尴尬场景。

#include <stdio.h>
#include <string.h>
int main()
{
    char str[20];
    printf("请输入字符串:");
    gets(str);
    printf("请输出字符串:");
    puts(str);
   return 0;
}

  • 14
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西柚小萌新

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值