字符串輸入函數:
?????????scanf("%s",數組名)?
????????gets(數組名)?
????????fgets()? --- 文件流輸入函數
函數原型:
????????int scanf( const char *format, ... );
????????char *gets( char *str );
????????char *fgets(char *str,int num,FILE *stream);
區別:
????????scanf()把空格字符識別為輸入結束
? ? ? ? gets() 會把空格字符也存到數組中
? ? ? ?相同:遇到換行符\n輸入結束
? ? ? ? ? ? ? ? ?fgets()會把換行字符\n也會吸收到數組中.
代碼:(scanf 和 gets )
#include <stdio.h>
#include <string.h>int main(void)
{char r_buf1[30]={0};char r_buf2[30]={0};int len;//測試scanfscanf("%s",r_buf1);len = strlen(r_buf1);printf("scanf_len=%d\r\n",len);printf("scanf=%s\r\n",r_buf1);// //測試gets// gets(r_buf2);// len = strlen(r_buf2);// printf("gets_len=%d\r\n",len);// printf("gets=%s\r\n",r_buf2);return 0;
}
現象:?(scanf 和 gets )
scanf()跳過空格繼續輸入的處理:?
?????????scanf("%[^\n]",r_buf1);
????????%[^\n]
?匹配除換行符以外的任何字符序列;可以指定字符 ,如?%[^b]
;
? ? ? ? 即直到遇到換行符或者指定字符才結束輸入,否則默認遇到空格結束輸入。
#include <stdio.h>
#include <string.h>int main(void)
{char r_buf1[30]={0};int len;//測試scanf讀取空格scanf("%[^\n]",r_buf1); //測試指定字符 scanf("%[^b]",r_buf1);len = strlen(r_buf1);printf("scanf_len=%d\r\n",len);printf("scanf=%s\r\n",r_buf1);return 0;
}
fgets()代碼與現象:
#include <stdio.h>
#include <string.h>int main(void)
{char r_buf[30]={0};int len;//測試fgetsfgets(r_buf,30,stdin);len = strlen(r_buf);printf("fgets_len=%d\r\n",len);printf("fgets=%s\r\n",r_buf);return 0;
}
? ? ? ? 字符數組有效字符為6個 并且多輸出了一次換行
? ? ? ? 因為??fgets()會把換行字符\n也會吸收到數組中.
? ? ? ? 可以把字符串數組的第5號元素改為'\0', 即能刪除多出的一次換行
????????r_buf[5]='\0';? ? ? ? 下面有講到通過strcspn函數定位到\n的元素索引位置的函數。
strcspn() 處理fgets的換行符
頭文件:#include <string.h>
函數原型:size_t strcspn( const char *str1, const char *str2 );????????size_t 等于 int 類型
函數功能:函數返回str1 開頭連續n個字符都不含字符串str2內任何某個字符的字符數。
#include <stdio.h>
#include <string.h>int main(void)
{/*測試strcspn*/int n;char str1[]= "hello world";char str2[]= "abo";n = strcspn(str1,str2);printf("n=%d\r\n",n);/*刪除fgets吸收的換行符\n*/char r_buf[30]={0};int len;fgets(r_buf,30,stdin);len = strcspn(r_buf,"\n");r_buf[len] = '\0';printf("fgets=%s\r\n",r_buf);return 0;
}
字符串輸出函數:
????????printf(“xxx%s”,數組名)
? ? ? ? puts(數組名)??
? ? ? ? fputs()? ?--- 文件流輸出函數
函數原型:
????????int printf( const char *format, ... );
????????int puts( char *str );
????????int fputs( const char *str, FILE *stream );
區別:
? ? ? ?printf()可以放描述語?
? ? ? ? puts()自動加換行符
相同:默認輸出到STDOUT標準輸出上.