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()去消去输入缓存区的回车符。