带有空格的字符串输入及反向输出
gets与scanf的区别:
gets(s)函数与scanf("%s",s)相似,但不完全相同,使用scanf("%s",s)
函数输入字符串时存在一个问题,就是如果输入了空格会认为字符串结束,空格后的字符将作为下一个输入项处理,但gets()函数将接收输入的整个字符串直到遇到换行为止。
用scanf输入
原理
- 当输入%d时,输出遇到空格可以自动忽略,此时它只检测数字;
- 当输入%c时,输出遇到空格就相当于看见了’\0’,此时自动停止输出(即空格之后的字符不会读出)
解决办法
- 首先,使用循环进行字符串的输入;
- 使用“”scanf“”输入项的值判断是否结束循环;
- 最后同样使用循环,对字符串进行输出。
代码展示
#include<stdio.h>
#include<string.h>
int main()
{
char ch;
int i=0,j,k;
char a[30];
while((ch=getchar())!='\n')
{
a[i]=ch;
i++;
}
for(j=0;j<i;j++)
printf("%c",a[j]);
printf("\n");
for(k=i-1;k>=0;k--)
printf("%c",a[k]);
return 0;
}
结果展示
用gets输入
原理
gets与gets的区别
gets
- 函数原型:chargets(charbuffer);
- 读取:gets(str),str为数组名;
- 功能:从键盘上输入字符,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中;
- 读取的换行符被转换为null值,做为字符数组的最后一个字符,来结束字符串。
- 注意:gets函数由于没有指定输入字符大小,所以会无限读取,一旦输入的字符大于数组长度,就会发生内存越界,从而造成程序崩溃或其他数据的错误。
fgets
- 函数原型:char *fgets(char *s, int n, FILE *stream);
- 读取:fgets(str, sizeof(str), stdin),其中str为数组首地址,sizeof(str)为数组大小,stdin表示我们从键盘输入数据;
- 功能:从文件指针stream中读取字符,存到以s为起始地址的空间里,知道读完N-1个字符,或者读完一行;
- 注意:调用fgets函数时,最多只能读入n-1个字符。读入结束后,系统将自动在最后加’\0’,并以str作为函数值返回。
代码展示
#include<stdio.h>
#include<string.h>
int main()
{
unsigned long i,t=0;
char a[30];
gets(a);
t=strlen(a);
for(i=t;i>0;i--)
printf("%c",a[i]);
printf("\n");
return 0;
}
结果展示
这里的警告:由于gets函数由于没有指定输入字符大小,会无限读取,可能会发生内存越界,从而造成程序崩溃或其他数据的错误。(简单的来说,就是不安全),但一般情况下,不会出问题。