C语言之字符串的存储和表示(输入和输出)

C语言之字符串的存储和表示

逐个字符输入输出字符串

在C语言中字符串是保存在数组中的,因此在输入一串字符的时候我们需要先定义一个数组。

#define STR_LEN 80
char str[STR_LEN+1];

一般我们习惯将宏定义STR_LEN设置为字符串的长度,但字符串需要用‘\0’结尾所以在定义数组的时候我们要加一。
逐个输入我们需要知道字符串的长度,以此才能判断循环的次数

for(int i=0;i<STE_LEN+1;i++)
{
	getchar(str[i]);
}

逐个输出:因为c语言中字符串数组中最后一个是‘/0’所以可以用来判断循环次数

for(int i=0;str[i]!='\0';i++)  //直到遇到字符串结束标志结束循环
{
	putchar(str[i]);
}

整体输入输出字符串

两种方式 一、

scanf("%s",str);
printf("%s\n",str);

二、

gets(str);
puts(str);

其中第二种的输出在输出时会自动换行,所以这两个代码的输出效果是一样的。
不同的是输入

用scnaf输入字符串

因为以%s输入字符串时,在开始读之前会跳过回车、空格、换行符这些空白字符,再次遇到空白字符就就读入结束了。因此这种方法无法读入空格、制表符这些空白字符
例如,运行以下代码时

#include<stdio.h>
#define STR_LEN 80
int main()
{
	char str[STR_LEN+1];
	printf("input a sting:");
	scanf("%s",str);
	printf("%s\n",str);
	
	return 0;
}

我们输入hellow world
运行结果
hellow后面的字符串就不会输出出来

用gets输入字符串

因为gets函数是以换行作为终止符的,所以我们可以输入空格或者制表符,这样空格也是字符串的一部分了

#include<stdio.h>
#define STR_LEN 80
int main()
{
 char str[STR_LEN+1];
 printf("input a sting:");
 gets(str);
 return 0;
}

我们输入hellow world
运行结果
此外scanf函数无法从输入缓存区读走换行符,什么意思呢?
看这个代码

#include<stdio.h>
#define STR_LEN 80
int main()
{
 char str[STR_LEN+1];
 printf("input a sting:");
 scanf("%s",str);
 printf("%s\n",str);
 printf("input a sting:");
 gets(str);
 printf("%s\n",str);
 
 return 0;
}

我们输入hellow

运行结果
我们会发现本来我们还需要再用gets输入一个字符串,结果自动输入了换行符
总结就是用scanf输入字符串的时候,他不会读入换行符。因此,换行符还会在输入缓存区中,等待下一次的输入。那如果我们需要用scanf去输入字符串如何解决这个问题呢?
很简单,在输出的后面加一行getchar();这样就能读走换行符

#include<stdio.h>
#define STR_LEN 80
int main()
{
 char str[STR_LEN+1];
 printf("input a sting:");
 scanf("%s",str);
 printf("%s\n",str);
 getchar();//读走输入缓冲区中的换行符
 printf("input a sting:");
 gets(str);
 printf("%s\n",str);
 
 return 0;
}

我们输入hellow
在这里插入图片描述
会提醒让我们进行下一次的输入,这样就解决了scanf后面再有输入的话不影响的问题。

而gets()函数就会读走输入缓存区的回车符,因此不需要在gets()函数后加入getchar()去消去输入缓存区的回车符。

发布了35 篇原创文章 · 获赞 13 · 访问量 2113

猜你喜欢

转载自blog.csdn.net/weixin_42458272/article/details/86558648