C语言字符串gets(str) c语言gets函数

c\u8bed\u8a00\u4e2d\uff0c\u8f93\u5165\u4e00\u4e2a\u5b57\u7b26\u4e32\u4f7f\u7528scanf(\u201d%s\u201d)\u548cgets()\u6709\u4ec0\u4e48\u533a\u522b

\u5176\u5b9e\u7528scanf("%s",);\u548cgets();\u672c\u8d28\u4e0a\u6ca1\u6709\u4ec0\u4e48\u533a\u522b\uff0c\u90fd\u662f\u5c06\u5b57\u7b26\u6570\u636e\u8f93\u5165\u5230\u5236\u5b9a\u7684\u5185\u5b58\u5355\u5143\u4e2d\u3002
\u5047\u8bbe\u5b9a\u4e49\u6709\u5b57\u7b26\u6570\u7ec4\uff08C\u8bed\u8a00\u628a\u5b57\u7b26\u4e32\u6309\u5b57\u7b26\u6570\u7ec4\u5904\u7406\uff09str[30]\uff0c\u90a3\u4e48\u6211\u4eec\u5411\u91cc\u9762\u8f93\u5165\u5b57\u7b26\u5c31\u53ef\u4ee5\u4e3a\uff1a
scanf("%s",str);
gets(str);
\u4ed6\u4eec\u90fd\u53ef\u4ee5\u8fd9\u6837\u8f93\u51fa\uff1a
printf("%s",str);
\u6216\u8005puts(str);
\u6ce8\u610f\uff1a
(1)\u4f7f\u7528scanf\u8f93\u5165\u5b57\u7b26\u4e32\u4e00\u5b9a\u4e0d\u80fd\u5199\u6210\u201cscanf("%s",&str);\u201d\uff0c\u56e0\u4e3astr\u662f\u6570\u7ec4\u540d\uff0c\u4f5c\u4e3a\u4e00\u4e2a\u5730\u5740\u5b58\u5728\uff0c\u662f\u4e0d\u80fd\u518d\u8fdb\u884c\u201c&\u201d\u8fd0\u7b97\u7684\u3002
(2)gets();\u548cputs();\u4e00\u6b21\u53ea\u80fd\u8f93\u5165\u4e00\u4e2a\u5b57\u7b26\u6570\u7ec4\uff0c\u6bd4\u5982\u5199\u6210\u201cgets(str1,str2);\u201d\u800c\u60f3\u4e00\u6b21\u8f93\u5165\u4e24\u4e2a\u5b57\u7b26\u4e32\uff0c\u90a3\u662f\u4e0d\u884c\u7684\u3002

gets()\u51fd\u6570\u7528\u4e8e\u4ece\u7f13\u51b2\u533a\u4e2d\u8bfb\u53d6\u5b57\u7b26\u4e32\uff0c\u5176\u539f\u578b\u5982\u4e0b\uff1a
char *gets(char *string);
gets()\u51fd\u6570\u4ece\u6d41\u4e2d\u8bfb\u53d6\u5b57\u7b26\u4e32\uff0c\u76f4\u5230\u51fa\u73b0\u6362\u884c\u7b26\u6216\u8bfb\u5230\u6587\u4ef6\u5c3e\u4e3a\u6b62\uff0c\u6700\u540e\u52a0\u4e0aNULL\u4f5c\u4e3a\u5b57\u7b26\u4e32\u7ed3\u675f\u3002\u6240\u8bfb\u53d6\u7684\u5b57\u7b26\u4e32\u6682\u5b58\u5728\u7ed9\u5b9a\u7684\u53c2\u6570string\u4e2d\u3002
\u3010\u8fd4\u56de\u503c\u3011\u82e5\u6210\u529f\u5219\u8fd4\u56destring\u7684\u6307\u9488\uff0c\u5426\u5219\u8fd4\u56deNULL\u3002
\u6ce8\u610f\uff1a\u7531\u4e8egets()\u4e0d\u68c0\u67e5\u5b57\u7b26\u4e32string\u7684\u5927\u5c0f\uff0c\u5fc5\u987b\u9047\u5230\u6362\u884c\u7b26\u6216\u6587\u4ef6\u7ed3\u5c3e\u624d\u4f1a\u7ed3\u675f\u8f93\u5165\uff0c\u56e0\u6b64\u5bb9\u6613\u9020\u6210\u7f13\u5b58\u6ea2\u51fa\u7684\u5b89\u5168\u6027\u95ee\u9898\uff0c\u5bfc\u81f4\u7a0b\u5e8f\u5d29\u6e83\uff0c\u53ef\u4ee5\u4f7f\u7528fgets()\u4ee3\u66ff\u3002

\u6269\u5c55\u8d44\u6599:
\u529f\u80fd
\u4ecestdio\u6d41\u4e2d\u8bfb\u53d6\u5b57\u7b26\u4e32\uff0c\u76f4\u81f3\u63a5\u53d7\u5230\u6362\u884c\u7b26\u6216EOF\u65f6\u505c\u6b62\uff0c\u5e76\u5c06\u8bfb\u53d6\u7684\u7ed3\u679c\u5b58\u653e\u5728buffer\u6307\u9488\u6240\u6307\u5411\u7684\u5b57\u7b26\u6570\u7ec4\u4e2d\u3002\u6362\u884c\u7b26\u4e0d\u4f5c\u4e3a\u8bfb\u53d6\u4e32\u7684\u5185\u5bb9\uff0c\u8bfb\u53d6\u7684\u6362\u884c\u7b26\u88ab\u8f6c\u6362\u4e3a\u2018\0\u2019\u7a7a\u5b57\u7b26\uff0c\u5e76\u7531\u6b64\u6765\u7ed3\u675f\u5b57\u7b26\u4e32\u3002
\u8fd4\u56de\u503c
\u8bfb\u5165\u6210\u529f\uff0c\u8fd4\u56de\u4e0e\u53c2\u6570buffer\u76f8\u540c\u7684\u6307\u9488\uff1b\u8bfb\u5165\u8fc7\u7a0b\u4e2d\u9047\u5230EOF(End-of-File)\u6216\u53d1\u751f\u9519\u8bef\uff0c\u8fd4\u56deNULL\u6307\u9488\u3002\u6240\u4ee5\u5728\u9047\u5230\u8fd4\u56de\u503c\u4e3aNULL\u7684\u60c5\u51b5\uff0c\u8981\u7528ferror\u6216feof\u51fd\u6570\u68c0\u67e5\u662f\u53d1\u751f\u9519\u8bef\u8fd8\u662f\u9047\u5230EOF\u3002
\u6ce8\u610f
\u672c\u51fd\u6570\u53ef\u4ee5\u65e0\u9650\u8bfb\u53d6\uff0c\u4e0d\u4f1a\u5224\u65ad\u4e0a\u9650\uff0c\u6240\u4ee5\u7a0b\u5e8f\u5458\u5e94\u8be5\u786e\u4fddbuffer\u7684\u7a7a\u95f4\u8db3\u591f\u5927\uff0c\u4ee5\u4fbf\u5728\u6267\u884c\u8bfb\u64cd\u4f5c\u65f6\u4e0d\u53d1\u751f\u6ea2\u51fa\u3002\u5982\u679c\u6ea2\u51fa\uff0c\u591a\u51fa\u6765\u7684\u5b57\u7b26\u5c06\u88ab\u5199\u5165\u5230\u5806\u6808\u4e2d\uff0c\u8fd9\u5c31\u8986\u76d6\u4e86\u5806\u6808\u539f\u5148\u7684\u5185\u5bb9\uff0c\u7834\u574f\u4e00\u4e2a\u6216\u591a\u4e2a\u4e0d\u76f8\u5173\u53d8\u91cf\u7684\u503c\u3002
\u8fd9\u4e2a\u4e8b\u5b9e\u5bfc\u81f4gets\u51fd\u6570\u53ea\u9002\u7528\u4e8e\u73a9\u5177\u7a0b\u5e8f,\u4e3a\u4e86\u907f\u514d\u8fd9\u79cd\u60c5\u51b5\uff0c\u6211\u4eec\u53ef\u4ee5\u7528fgets(stdin) (fgets\u5b9e\u9645\u4e0a\u53ef\u4ee5\u8bfb\u53d6\u6807\u51c6\u8f93\u5165(\u5373\u5927\u591a\u6570\u60c5\u51b5\u4e0b\u7684\u952e\u76d8\u8f93\u5165),\u5177\u4f53\u53c2\u9605fgets\u8bcd\u6761)\u6765\u66ff\u6362gets()\u3002\u5728V7\u7684\u624b\u518c\uff081979\u5e74\uff09\u4e2d\u8bf4\u660e\uff1a\u4e3a\u4e86\u5411\u540e\u517c\u5bb9\uff0cgets\u5220\u9664\u6362\u884c\u7b26\uff0cgets\u5e76\u4e0d\u5c06\u6362\u884c\u7b26\u5b58\u5165\u7f13\u51b2\u533a\u3002
\u53c2\u8003\u8d44\u6599:\u767e\u5ea6\u767e\u79d1-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璇█涓殑杩欎簺璇彞gets,fgets,puts,sprintf,strcpy,strcat,strcm...
    绛旓細銆4銆戞敞鎰忥細鏈嚱鏁板彲浠ユ棤闄愯鍙栵紝涓嶄細鍒ゆ柇涓婇檺锛屾墍浠ョ▼搴忓憳搴旇纭繚str鐨勭┖闂磋冻澶熷ぇ锛屼互渚垮湪鎵ц璇绘搷浣滄椂涓嶅彂鐢熸孩鍑恒傘5銆戠ず渚嬶細include"stdio.h"void main(){ char str1[5];gets(str1);printf("%s\n",str1);} fgets鍑芥暟鍚: fgets 鍔 鑳: 浠庢祦涓鍙栦竴瀛楃涓 鐢 娉: char *fgets(char ...
  • gets() c璇█
    绛旓細gets()鎷彿涓殑鍊煎簲璇ユ槸鍦板潃鍊硷紝琛ㄧず瀛楃涓鍐欏叆鐨勯鍦板潃銆str涓烘暟缁勫悕琛ㄧず锛屼害涓哄湴鍧鍊笺備絾*str骞朵笉琛ㄧず鍦板潃鍊兼槸琛ㄧず鏁扮粍绗竴涓厓绱犵殑鏁板硷紝char *str鏄0鏄庝簡涓涓瓧绗﹀瀷鎸囬拡鍙仛str锛屾晠鍚庝袱绉嶅潎閿欒銆
  • c璇█scanf 鍜gets瀵瀛楃涓鐨勮緭鍏
    绛旓細鍦ㄨ繖娈电畝鍗曠殑绋嬪簭涓紝浼氬嚭鐜扮殑鏄棶棰樺湪gets(str);澶勩傚綋鐢╯canf("%s",str);鏉ヨ幏鍙栬繖娈佃嫳鏂囨枃瀛楃殑鏃跺欙紝杈撳嚭浼氬湪绗竴涓┖鏍肩殑鍦版柟绋嬪簭缁撴潫锛屽涓嬪浘锛氳屼娇鐢╣ets()鏃朵笉浼氬嚭鐜拌繖绉嶆儏鍐碉紝鍙互鎶婄┖鏍间箣鍚庣殑瀛楃涔熼兘姝e父杈撳嚭鏉ャ傜涓娆¤緭鍏ello world!鍚庯紝瀛楃涓Hello world!閮戒細琚鍒拌緭鍏ョ紦鍐插尯涓紝...
  • C璇█涓緭鍏瀛楃涓,閲岄潰鏈夌┖鏍,鎬庝箞鏍规嵁绌烘牸鎶婂瓧绗︿覆鍒嗗紑,骞跺瓨鍦ㄦ暟缁勯噷...
    绛旓細绋嬪簭婧愮爜濡備笅锛歩nclude<stdio.h> include<string.h> int main(void){ char str[1000];//瀹氫箟涓涓瓧绗︿覆鏁扮粍 char strnew[1000];//瀹氫箟涓涓鐢ㄥ瓧绗︿覆鏁扮粍 char m[] = " ";//瀹氫箟绌烘牸鍙橀噺 printf("璇疯緭鍏ヤ竴涓插瓧绗锛");//鏂囧瓧鎻愮ず杈撳叆瀛楃涓 gets(str);//杈撳叆瀛楃涓 char *p = strtok(...
  • C璇█銆傝緭鍏ヤ竴涓瀛楃涓,鍐呮湁鏁扮粍鍜岄潪鏁板瓧瀛楃,灏嗗叾涓繛缁殑鏁板瓧浣滀负涓涓...
    绛旓細include <stdio.h> include <math.h> void output(char *s, int n); //瀹氫箟杈撳嚭鍑芥暟 int main(){ char str[30];printf("Please enter string: "); //杈撳叆瀛楃涓 gets(str);output(str, 30); //璋冪敤杈撳嚭鍑芥暟 return 0;} //杈撳嚭鍑芥暟 void output(char *s, int n){ char ...
  • c璇█,浠庨敭鐩樿緭鍏ヤ竴涓瀛楃涓,缁熻瀛楃涓蹭腑鐗瑰畾瀛楃鐨勪釜鏁,骞惰緭鍑轰釜鏁...
    绛旓細include "stdio.h"main(){ char str[100],ch; /*瀹氫箟str瀛楃涓锛屽畾涔塩h鐢ㄦ潵瀛樻斁瑕佺粺璁$殑瀛楃*/ int cnt=0,i; /*瀹氫箟cnt鐢ㄤ綔璁℃暟鍣紝鍒濆鍊间负0*/ /*杈撳叆瀛楃涓*/ printf("璇疯緭鍏ュ瓧绗︿覆锛"); gets(str); /*杈撳叆瑕佺粺璁$殑瀛楃*/ printf("璇疯緭鍏ヨ缁熻鐨勫瓧绗︼細"); ...
  • C璇█涓gets鐨勭敤娉曟槸鎬庢牱鐨,璇峰悇浣嶆寚鐐逛竴涓
    绛旓細gets灏辨槸鎺ュ彈涓涓瀛楃涓锛涙瘮濡傝浣犲厛瀹氫箟浜嗕竴涓瓧绗﹀瀷鐨勬暟缁剆tr鍙鍦ㄧ▼搴忎腑鍐欏叆锛gets锛坰tr锛锛涘湪杩愯绋嬪簭鏃跺氨鍙互杈撳叆涓涓瓧绗︿覆骞跺瓨鍏tr鏁扮粍涓!!鎴戝垰瀛锛佹劅瑙夎繕琛屼竴璧峰姞娌光問(^蠅^)鈫
  • gets鍦c璇█涓庝箞鐢
    绛旓細鍦C璇█涓紝gets鍑芥暟鐢ㄤ簬浠庢爣鍑嗚緭鍏ワ紙閫氬父鏄敭鐩橈級璇诲彇涓琛瀛楃涓锛岀洿鍒伴亣鍒版崲琛岀锛'\n'锛夋垨璇诲彇鍒癊OF锛圗nd Of File锛屾枃浠剁粨鏉熸爣蹇楋級銆俫ets鍑芥暟閫氬父鐢ㄤ簬璇诲彇鐢ㄦ埛杈撳叆鐨勫瓧绗︿覆锛屼絾鍦ㄥ疄闄呭簲鐢ㄤ腑闇瑕佹敞鎰忓畨鍏ㄦч棶棰橈紝鍥犱负璇ュ嚱鏁版棤娉曢檺鍒惰緭鍏ョ殑闀垮害锛屽鏄撳鑷寸紦鍐插尯婧㈠嚭銆傛垜浠娇鐢╬rintf鍑芥暟杈撳嚭璇诲彇鍒扮殑瀛楃涓...
  • C璇█缂栧啓:杈撳叆浠绘剰涓涓瀛楃涓,缁熻璇ュ瓧绗︿覆涓嚭鐜扮殑瀛楃a鐨勪釜鏁,骞惰緭...
    绛旓細/*缂栫▼浠庨敭鐩樿緭鍏ヤ竴涓瀛楃涓,缁熻璇ュ瓧绗︿覆涓粠'a'鍒'z'鍏26涓皬鍐欏瓧姣嶅悇鑷嚭鐜扮殑娆℃暟, 灏嗙粨鏋滃瓨鍏ユ暟缁勪腑,骞惰緭鍑*/ #include<stdio.h> #include<string.h> #define N 100 main() {int i,j=0,c[26]={0}; char str[N]; printf("璇疯緭鍏ヤ竴涓瓧绗︿覆:"); gets(str); for(i=0;i<strlen...
  • C璇█:缂栫▼缁熻瀛楃涓瞫鍦瀛楃涓瞫tr涓嚭鐜扮殑娆℃暟
    绛旓細浠ヤ笅鏄 C 璇█瀹炵幇缁熻瀛楃涓 s 鍦瀛楃涓 str 涓嚭鐜扮殑娆℃暟鐨勭▼搴忥細```c include <stdio.h> include <string.h> // 缁熻瀛楃涓 s 鍦ㄥ瓧绗︿覆 str 涓嚭鐜扮殑娆℃暟 int countSubstring(char str[], char s[]) { int n = strlen(str); // 鑾峰彇瀛楃涓 str 鐨勯暱搴 int m = strlen(s); ...
  • 扩展阅读:c语言gets()函数 ... c语言中getchar的用法举例 ... 输入字符串c语言gets ... 利用gets输入字符串 ... c语言字符串拼接strcat ... c语言字符串函数strstr ... c语言怎么输入字符串 ... c语言getchar处理字符串 ... gets只能用于字符串吗 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网