http://blog.csdn.net/pipisorry/article/details/37073023
問題:
scanf(%s, a);
運行輸入hello world
回車
則輸入到a的只是空格之前的部分,怎樣把空格之後的部分也輸出?
1.
scanf
(
%[^ ]
, str );
#include
int main(){
char str[50];
scanf( %[^
], str );
printf( %s
, str );
return 0;
}
more:
scanf中的正則表達式
1、定制自己的掃描集 %[abc]、%[a-z]、%[^abc]、%[^a-z],比isdigit()、isalpha()更加靈活。[]內是匹配的字符,^表示求反集。
int i;
char str[80], str2[80];
// scanf(%d%[abc]%s, &i, str, str2);
// printf(%d %s %s ,i,str,str2);
// scanf(%[a-zA-Z0-9], str);
// scanf(%[^abce], str);
scanf(%[^a-z], str);
printf(%s ,str);
2、讀入一個地址並顯示內存地址的內容
int main(void){
char ch='c';
printf(%p , &ch); // print the address of ch.
char *p;
cout<
scanf(%p, &p); //input the address displayed above
printf(Value at location %p is %c ,p,*p);
return 0;
}
3、丟棄不想要的空白符:scanf(%c %c);
4、控制字符串中的非空白符:導致scanf()讀入並丟棄輸入流中的一個匹配字符。%d,%d;
5、壓縮輸入:在格式碼前加上*,則用戶就可以告訴scanf()讀這個域,但不把它賦予任何變量。
scanf(%c%*c, &ch); 使用此方法可以在字符處理時吃掉多余的回車。
2.scanf()
int t[999];
int sum=0;
while(scanf(%c,&t[sum++])!=EOF);
3.gets()gets()
#include
//char *fgets( char *str, int num, FILE *stream );
int main(){
char buffer[10];
//fgets(buffer,10,stdin); //帶有回車符
gets(buffer); //沒有回車符
printf(%s,buffer);
return 0;
}
more: gets() 不檢查字符串容量,有可能越界寫數據,用戶可不一定給你按套路出牌,可能輸入長達300字節甚至2k字節的字符串,這樣的話很危險
雖然strlen,strcyp等等這些函數因為追求高效率也不會檢查指針是否為空,指針是否可寫,但是這些函數是C程序員來操作的,C程序員有正確使用函數的素質。 但是gets() 是用戶來輸入,用戶並不知道字符串上限,而且就算知道,也不一定有素質去按規定使用,要多多注意
用fgets(str,80,stdin);就不危險了,fgets比較安全