C语言字符串gets(str)

供稿:hz-xin.com     日期:2025-01-21
c语言中,输入一个字符串使用scanf(”%s”)和gets()有什么区别

其实用scanf("%s",);和gets();本质上没有什么区别,都是将字符数据输入到制定的内存单元中。
假设定义有字符数组(C语言把字符串按字符数组处理)str[30],那么我们向里面输入字符就可以为:
scanf("%s",str);
gets(str);
他们都可以这样输出:
printf("%s",str);
或者puts(str);
注意:
(1)使用scanf输入字符串一定不能写成“scanf("%s",&str);”,因为str是数组名,作为一个地址存在,是不能再进行“&”运算的。
(2)gets();和puts();一次只能输入一个字符数组,比如写成“gets(str1,str2);”而想一次输入两个字符串,那是不行的。

gets()函数用于从缓冲区中读取字符串,其原型如下:
char *gets(char *string);
gets()函数从流中读取字符串,直到出现换行符或读到文件尾为止,最后加上NULL作为字符串结束。所读取的字符串暂存在给定的参数string中。
【返回值】若成功则返回string的指针,否则返回NULL。
注意:由于gets()不检查字符串string的大小,必须遇到换行符或文件结尾才会结束输入,因此容易造成缓存溢出的安全性问题,导致程序崩溃,可以使用fgets()代替。

扩展资料:
功能
从stdio流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为‘\0’空字符,并由此来结束字符串。
返回值
读入成功,返回与参数buffer相同的指针;读入过程中遇到EOF(End-of-File)或发生错误,返回NULL指针。所以在遇到返回值为NULL的情况,要用ferror或feof函数检查是发生错误还是遇到EOF。
注意
本函数可以无限读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值。
这个事实导致gets函数只适用于玩具程序,为了避免这种情况,我们可以用fgets(stdin) (fgets实际上可以读取标准输入(即大多数情况下的键盘输入),具体参阅fgets词条)来替换gets()。在V7的手册(1979年)中说明:为了向后兼容,gets删除换行符,gets并不将换行符存入缓冲区。
参考资料:百度百科-gets

在scanf("%c",&ch);之后加上getchar();

#include<stdio.h>

int main(void)

printf("Input a character: ");

scanf("%c",&ch);

fflush(stdin);//加上这句,清掉输入字符后,你再输入的回车符

printf("Input a string: ");

char str[80];

gets(str);

printf("%c
",ch);

puts(str);

return 0;

}


字符串

因为本函数可以无限读取,易发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值。

这个事实导致gets函数只适用于玩具程序,为了避免这种情况,可以用fgets(stdin) (fgets实际上可以读取标准输入,即大多数情况下的键盘输入),具体参阅fgets词条)来替换gets()。在V7的手册中说明:为了向后兼容,gets删除换行符,gets并不将换行符存入缓冲区。

以上内容参考:百度百科-gets



因为你输入一个字符后,又输入了一个回车键,这个回车键被存到了str这个字符数组中

所以出现了下面的输出:

加一句就行了,把标准输入文件缓存中的回车符去掉:

#include<stdio.h>
int main(void)
{
 char ch;
 printf("Input a character: ");
 scanf("%c",&ch);
 fflush(stdin);//加上这句,清掉输入字符后,你再输入的回车符
 printf("Input a string: ");
 char str[80];
 gets(str);
 printf("%c
",ch);
 puts(str);
 return 0;

}

这样就正确了:

 

这个问题是比较典型的,

 

主要就是由于scanf函数的不安全性造成的。



在 scanf("%c",&ch);之后加上getchar();

原因:因为你在输入的时候会敲回车,但是scanf遇到回车就停止输入,也就是说回车没有被输入,仍然停留在buffer中。于是,在遇到gets的时候,程序一开始就遇到回车,也就是字符串输入结束,从而str的内容为一个回车,这也是为什么输出会有一行空行的原因。加上getchar,程序会将残留的回车吃掉,于是gets的时候,buffer为空,让用户输入。

PS:这个问题在控制台有缓冲的时候会遇到(就是说只有敲回车,程序才会接受到输入),如果控制台没有缓存,则不会有这个问题。所以,如果你用cin.get同样会遇到这个问题,并不像@示申佥11说的是scanf的问题。

在scanf("%c",&ch);后面加个getchar();用来抵消回车键('\n')的影响

你需要理解STDIN,也就是输入缓存的概念。

当执行 scanf("%c", &ch); 时,你想想看,你都输入了什么?没错,一个字符,和一个回车('\n')。
scanf在当前输入缓存,找到了%c,写入ch后,将其从输入缓存移除,然后返回。

这时,输入缓存内还有一个字符,'\n'。

当你调用gets(str);后,发现输入缓存中还有内容,而且恰好由'\n'结束,于是,将"\n"这个字符串写入str,然后返回..

如果把连个过程反过来,
先调用 gets(str); 你输入内容.. 若干个字符,然后回车。(输入缓存中的内容自己想象哈)。gets把'\n'以及'\n'之前的所有字符,写入str,然后从输入缓存移除。这时输入缓存为空。

再调用scanf("%c", &ch),由于输入缓存为空,所以等待用户输入,用户输入一个字符,和一个回车,...

明白了吗?

c语言中,输入一个字符串使用scanf(”%s”)和gets()有什么区别
c语言中,输入一个字符串使用scanf("%s")和gets()在表面上看来并无太大差异,它们都承担着将字符数据输入到指定内存区域的任务。若我们定义一个名为str[30]的字符数组,通过这两者都可以进行这样的操作:scanf("%s",str);gets(str);它们都能以类似的方式输出:printf("%s",str);或者puts(str);...

C语言字符串gets(str)
include<stdio.h>int main(void){ char ch; printf("Input a character: "); scanf("%c",&ch); fflush(stdin);\/\/加上这句,清掉输入字符后,你再输入的回车符 printf("Input a string: "); char str[80]; gets(str); printf("%c\\n",ch); puts(str); return 0;} 这样就正确了...

C语言字符串gets(str)
在scanf("%c",&ch);之后加上getchar();include<stdio.h> int main(void)printf("Input a character: ");scanf("%c",&ch);fflush(stdin);\/\/加上这句,清掉输入字符后,你再输入的回车符 printf("Input a string: ");char str[80];gets(str);printf("%c\\n",ch);puts(str);return...

求c语言的字符串的输入格式,谢谢!
在C语言中,处理字符串输入时,通常使用`scanf("%s", str);`或`gets(str);`。`scanf()`函数用于读取固定格式的输入,当遇到空格、制表符或换行符时会停止读取。而`gets()`函数则会读取整个行,直到遇到换行符。下面是一个示例程序,演示了如何使用这两种函数来读取字符串:include <stdio.h> int...

字符串接收输入的函数?
C语言中,可以用gets函数来接收输入的字符串(包含空格)。格式:gets(字符数组名);功能:gets函数用于将输入的字符串内容存放到指定的字符数组中,输入结尾的换行符'\\n'被换成'\\0'存储在该数组中。举例说明如下:char str[20]; \/\/ 定义一个字符数组,大小为20个字节gets(str); \/\/ 将用户...

定义字符串 char a[100] 输入时,gets(str)和scanf("%s",a)有区别吗
有区别。 gets(str); 是读取一行字符串,直到换行,字符串里允许有空格 等空白字符。scanf("%s",a); 读取一个字符串,直到 空格之类的分隔符为止。例如:char a[100], str[100];当拍入一行内容是: there are six dogs gets(str); 读到的字符串 是: "there are six dogs".scanf(...

下面C语言函数的作用:puts(str),gets(str),strcmp(str1,str2),strcp...
puts(str):输出字符串str的内容。gets(str):输入字符串,存入str表示的空间。strcmp(str1,str2):比较两个字符串,str1>str2返回值>0,str1==str2返回值为0,str1<str2返回值<0 strcpy(str1,str2):将字符串str2复制到str1。

gets是什么意思
gets(str);在C语言中是从键盘上接收一个字符串,保存在str为首地址的字符串内存空间,以回车做为结束符

C语言中 gets 函数输入字符串,不能放在循环中 重复输入是怎么回事,程 ...
int main(){ char str[5];while(1){ printf("[gets]str=");gets(str);printf("gets:str:%s,length:%d\\n",str,strlen(str));printf("scanf,str=");scanf("%s",str);getchar();printf("scanf:str=%s\\n",str,strlen(str));if(str[0]=='f') break;} return 0;} scanf输入后...

gets怎么用?
一、问题描述:从键盘输入一个字符串给str和一个字符给c,删除str中的所有字符c并输出删除后的字符串str。1、输入:第一行是一个字符串; 第二行是一个字符。2、输出:删除指定字符后的字符串。二、设计思路:1、 同插入问题,定义两个字符数组a,b。以及标志删除位置的int型pos。2、用gets函数...