Ⅰ scanf(「%d」,&choose);很簡單的c語言問題。超高懸賞提問
switch(choose)
{
case1: OutputInformationByName( );break;
case2: OuputInformationByArea( );break;
case3: SearchByName( );break;
case4: SearchByArea( );break;
case5: p=MallocNode( );/*申請一個新的結點*/
InputInformation(p);/*用戶輸入新信息倒新結點*/
InsertOneNode(p);/*將新結點加到鏈表中*/
break;
case6: DeleteNode( );break;
case7: EditNode( );break;
case8: free(head);/*先釋放內存空間*/
exit(1);break;
default: break;
}
你吧全部代碼貼出來吧,這個里邊得函數一個都沒有,怎麼判斷?
Ⅱ 尋找一個c語言程序:從輸入中過濾字元串
我也試了一下,沒問題,你到底是什麼問題,是要在s1或s2中輸入空格嗎?那麼用gets函數;
gets()函數用來從標准輸入設備(鍵盤)讀取字元串直到換行符結束,但換行符會被丟棄,然後在末尾添加'\0'字元。
其調用格式為:gets(s);
其中s為字元串變數(字元串數組名或字元串指針)。
gets(s)函數與scanf("%s:",&s)/*scanf("%s",s)*/相似,但不完全相同,使用scanf("%s",&s);函數輸入字元串時存在一個問題,就是如果輸入了空格會認為字元串結束,空格後的字元將作為下一個輸入項處理,但gets()函數將接收輸入的整個字元串直到遇到換行為止。
你改為:
#include<stdio.h>
voidmain()
{chars1[50],s2[50];
gets(s1);
gets(s2);
printf("%s\n",s1);
printf("%s\n",s2);
}
這樣就用回車表示輸入結束
Ⅲ C語言scanf函數過濾換行符號嗎
剛剛做了下實驗,事實證明scanf也不會處理'\n'的,scanf只會按格式符從緩沖區讀取需要的數據,其專他的是不會動的。
比如屬:
int a;
char c;
scanf("%d", &a);
c = getchar();
輸入:123 回車
可以發現,getchar()函數沒有阻塞等待用戶輸入,而此時若是按%c格式列印變數c,則會發現換行了
經過我後續的實驗,也是可以證明,位於緩沖區隊列首部,也就是scanf取緩沖區數據時第一個取到的是'\n',它是會無視的
暫時還沒試 haiyangfenghuo 同學說的scanf()實參中帶\n
Ⅳ scanf("%[^n],c)具體含義
%[^n]表示接收非n字元的字元串。
c是一段連續空間的名字,跟指針完全不一樣。不過在值傳遞時傳的是首元素地址,所以scanf("",s)這里s是首元素地址,scanf("",&s)取這段空間的首地址,同樣是首元素地址。
scanf和sscanf函數對數據過濾有很多操作,可以網路下。以下sscanf的用法同樣適用scanf
sscanf() - 從一個字元串中讀進與指定格式相符的數據.
函數原型:
Int sscanf( string str, string fmt, mixed var1, mixed var2 ... );
int scanf( const char *format [,argument]... );
說明:
sscanf與scanf類似,都是用於輸入的,只是後者以屏幕(stdin)為輸入源,前者以固定字元串為輸入源。
其中的format可以是一個或多個 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符號}
註:
1、 * 亦可用於格式中, (即 %*d 和 %*s) 加了星號 (*) 表示跳過此數據不讀入. (也就是不把此數據讀入參數中)
2、{a|b|c}表示a,b,c中選一,[d],表示可以有d也可以沒有d。
3、width表示讀取寬度。
4、{h | l | I64 | L}:參數的size,通常h表示單位元組size,I表示2位元組 size,L表示4位元組size(double例外),l64表示8位元組size。
5、type :這就很多了,就是%s,%d之類。
6、特別的:%*[width] [{h | l | I64 | L}]type 表示滿足該條件的被過濾掉,不會向目標參數中寫入值
支持集合操作:
%[a-z] 表示匹配a到z中任意字元,貪婪性(盡可能多的匹配)
%[aB'] 匹配a、B、'中一員,貪婪性
%[^a] 匹配非a的任意字元,貪婪性
例子:
1. 常見用法。
char buf[512] = ;
sscanf("123456 ", "%s", buf);
printf("%s\n", buf);
結果為:123456
2. 取指定長度的字元串。如在下例中,取最大長度為4位元組的字元串。
sscanf("123456 ", "%4s", buf);
printf("%s\n", buf);
結果為:1234
3. 取到指定字元為止的字元串。如在下例中,取遇到空格為止字元串。
sscanf("123456 abcdedf", "%[^ ]", buf);
printf("%s\n", buf);
結果為:123456
4. 取僅包含指定字元集的字元串。如在下例中,取僅包含1到9和小寫字母的字元串。
sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);
printf("%s\n", buf);
結果為:123456abcdedf
5. 取到指定字元集為止的字元串。如在下例中,取遇到大寫字母為止的字元串。
sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);
printf("%s\n", buf);
結果為:123456abcdedf
6、給定一個字元串iios/12DDWDFF@122,獲取 / 和 @ 之間的字元串,先將 "iios/"過濾掉,再將非'@'的一串內容送到buf中
sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);
printf("%s\n", buf);
結果為:12DDWDFF
7、給定一個字元串「「hello, world」,僅保留world。(注意:「,」之後有一空格)
sscanf(「hello, world」, "%*s%s", buf);
printf("%s\n", buf);
結果為:world
%*s表示第一個匹配到的%s被過濾掉,即hello被過濾了
如果沒有空格則結果為NULL。
sscanf的功能很類似於正則表達式, 但卻沒有正則表達式強大,所以如果對於比較復雜的字元串處理,建議使用正則表達式.
//-------------------------------------------------------
sscanf,表示從字元串中格式化輸入
上面表示從str中,輸入數字給x,就是32700
久以前,我以為c沒有自己的split string函數,後來我發現了sscanf;一直以來,我以為sscanf只能以空格來界定字元串,現在我發現我錯了。
sscanf是一個運行時函數,原形很簡單:
int sscanf(
const char *buffer,
const char *format [,
argument ] ...
);
它強大的功能體現在對format的支持上。
我以前用它來分隔類似這樣的字元串2006:03:18:
int a, b, c;
sscanf("2006:03:18", "%d:%d:%d", a, b, c);
以及2006:03:18 - 2006:04:18:
char sztime1[16] = "", sztime2[16] = "";
sscanf("2006:03:18 - 2006:04:18", "%s - %s", sztime1, sztime2);
但是後來,我需要處理2006:03:18-2006:04:18
僅僅是取消了『-』兩邊的空格,卻打破了%s對字元串的界定。
我需要重新設計一個函數來處理這樣的情況?這並不復雜,但是,為了使所有的代碼都有統一的風格,我需要改動很多地方,把已有的sscanf替換成我自己的分割函數。我以為我肯定需要這樣做,並伴隨著對sscanf的強烈不滿而入睡;一覺醒來,發現其實不必。
format-type中有%[]這樣的type field。如果讀取的字元串,不是以空格來分隔的話,就可以使用%[]。
%[]類似於一個正則表達式。[a-z]表示讀取a-z的所有字元,[^a-z]表示讀取除a-z以外的所有字元。
所以那個問題也就迎刃而解了:
sscanf("2006:03:18 - 2006:04:18", "%[0-9,:] - %[0-9,:]", sztime1, sztime2);
在softmse (Jake) 的問題貼http://community.csdn.net/Expert/topic/4843/4843294.xml?temp=.4321558中 ,周星星給出了一個很cool的sscanf用例,而後通過學習,發現sscanf真棒,現做一總結。
原問題:
iios/12DDWDFF@122
獲取/和@之間的字元串怎麼做
C程序裡面有什麼函數嗎?
周星星的代碼:
#include <stdio.h>
int main()
{
const char* s = "iios/12DDWDFF@122";
char buf[20];
sscanf( s, "%*[^/]/%[^@]", buf );
printf( "%s\n", buf );
return 0;
}
結果為:12DDWDFF
sscanf與scanf類似,都是用於輸入的,只是後者以屏幕(stdin)為輸入源,前者以固定字元串為輸入源。
函數原型:
int scanf( const char *format [,argument]... );
其中的format可以是一個或多個 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符號},
註:{a|b|c}表示a,b,c中選一,[d],表示可以有d也可以沒有d。
width:寬度,一般可以忽略,用法如:
const char sourceStr[] = "hello, world";
char buf[10] = ;
sscanf(sourceStr, "%5s", buf); //%5s,只取5個字元
cout << buf<< endl;
結果為:hello
{h | l | I64 | L}:參數的size,通常h表示單位元組size,I表示2位元組 size,L表示4位元組size(double例外),l64表示8位元組size。
type :這就很多了,就是%s,%d之類。
特別的:
%*[width] [{h | l | I64 | L}]type 表示滿足該條件的被過濾掉,不會向目標參數中寫入值。如:
const char sourceStr[] = "hello, world";
char buf[10] = ;
sscanf(sourceStr, "%*s%s", buf); //%*s表示第一個匹配到的%s被過濾掉,即hello被過濾了
cout << buf<< endl;
結果為:world
支持集合操作:
%[a-z] 表示匹配a到z中任意字元,貪婪性(盡可能多的匹配)
%[aB'] 匹配a、B、'中一員,貪婪性
%[^a] 匹配非a的任意字元,貪婪性
是不是感覺眼熟了啊,不錯,這和正則表達式很相似,而且仍然支持過濾,即可以有%*[a-z].如:
星星大哥例子回顧:
const char* s = "iios/12DDWDFF@122";
char buf[20];
sscanf( s, "%*[^/]/%[^@]", buf );
printf( "%s\n", buf );
由例子3-》取到指定字元為止的字元串。如在下例中,取遇到空格為止字元串。
sscanf("123456 abcdedf", "%[^ ]", buf);
printf("%s\n", buf);
結果為:123456
所以周星星的代碼總結應該為:
const char* s = "iios/12DDWDFF@122";
char buf[20];
sscanf( s, "%*[^/]/%[^@]", buf );
printf( "%s\n", buf );
先將 "iios/"過濾掉,再將到字元'@'為止的一串12DDWDFF(由例3可得此串到@為止,把@122舍掉)內容即是:12DDWDFF送到buf中,得到結果。
Ⅳ scanf 讀入三個數據忽略中間一個語法怎麼寫
我想知道這樣子又有什麼意義? 你可以看一下 scanf 格式 大全
A format specification has the following form:
%[*] [width]
[{h | l | I64 | L}]type
The format argument specifies the interpretation of the input and can contain
one or more of the following:
White-space characters: blank (' '); tab ('\t'); or newline ('\n').
A white-space character causes scanf to read, but not store, all
consecutive white-space characters in the input up to the next non–white-space
character.
One white-space character in the format matches any number (including 0) and
combination of white-space characters in the input.
Non–white-space characters, except for the percent sign (%).
A non–white-space character causes scanf to read, but not store, a
matching non–white-space character.
If the next character in stdin does not match, scanf
terminates.
Format specifications, introced by the percent sign (%).
A format specification causes scanf to read and convert characters in
the input into values of a specified type. The value is assigned to an argument
in the argument list.
The format is read from left to right.
Characters outside format specifications are expected to match the sequence
of characters in stdin; the matching characters in stdin are
scanned but not stored. If a character in stdin conflicts with the format
specification, scanf terminates, and the character is left in
stdin as if it had not been read.
When the first format specification is encountered, the value of the first
input field is converted according to this specification and stored in the
location that is specified by the first argument.
The second format specification causes the second input field to be converted
and stored in the second argument, and so on through the end of the
format string.
An input field is defined as all characters up to the first white-space
character (space, tab, or newline), or up to the first character that cannot be
converted according to the format specification, or until the field width (if
specified) is reached.
If there are too many arguments for the given specifications, the extra
arguments are evaluated but ignored.
The results are unpredictable if there are not enough arguments for the
format specification.
Each field of the format specification is a single character or a number
signifying a particular format option.
The type character, which appears after the last optional format
field, determines whether the input field is interpreted as a character, a
string, or a number.
The simplest format specification contains only the percent sign (%)
and a type character (for example, %s).
If a percent sign is followed by a character that has no meaning as a
format-control character, that character and the following characters (up to the
next percent sign) are treated as an ordinary sequence of characters, that is, a
sequence of characters that must match the input.
For example, to specify that a percent-sign character is to be input, use
%%.
An asterisk (*) following the percent sign suppresses assignment of the next
input field, which is interpreted as a field of the specified type. The field is
scanned but not stored.
當然 需要你有 英語功底
Ⅵ C語言問題 scanf讀取問題
char類型數據在輸入時,用scanf()函數輸入時,格式控制串用%c,但由於輸入的方式不同,代碼要採用不同的語句進行控制。輸入一個字元,按一次回車 #include void main() { int i; char ch; for( i=0;i<10;i++ ){ printf("input %d : ", i+1); scanf("%c%*c", &ch ); //用%*c吸收掉回車符。不然,下一次讀字元,就會讀到這個回車符。 printf("%c:%d\n", ch, ch ); //輸出字元和ASCII值 %c表示輸出按字元,%d表示輸出按ascii值。 } } 連續輸入字元,直到回車結束(這時,不需要加過濾操作) #include void main() { int i; char ch; for( i=0;i<10;i++ ){ scanf("%c", &ch ); //或用ch=getchar(); if ( ch=='\n') break; //遇回車結束輸入 printf("%c:%d\n", ch, ch ); //輸出字元和ASCII值 } } 用戶在鍵盤輸入時,所有的按鍵不會直接反應到程序變數中,而是先存儲到輸入緩存區中,程序在讀取數據時,是從輸入緩存中讀取。所有的按鍵都會映射成相應的字元,如:回車、空格等都是有效的字元,所以,在讀字元時,程序不會自動忽略它們,如果需要忽略,需要進行程序代碼控制。
Ⅶ 急!!scanf怎樣過濾空格和換行。。。
scanf()函數默認空格、制抄表符、換行符為襲數值、字元和字元串的分隔符,也就是說,是自動過濾的,比如
int val;
char ch,s[50];
scanf("%d%c%s");
可以輸入5 A character
該讀入語句可使val = 5,ch = 'A',s = "character"。
Ⅷ C語言中,scanf時輸入數據時, 如何忽略輸入的字元
輸入完數據,緊跟著一個getchar()可以吸收一個字元
Ⅸ C語言中用scanf函數輸入字元時,為什麼要在輸入控制符%c前面加空格用scanf還有哪些要注意
空格確實不是必須的,但有了空格就可以忽略你輸入的空格。
例如:scanf(" %c" ,&c),你輸入了' a'(a前面有個空格),a就能被c接受。
但控制符前如果沒空格,那c就接受了空格,這個可以防止誤操作,忽略空格輸入,接受第一個非空格輸入。
注意事項:
對於scanf()而言,%c是個較為特殊的說明符。 %c前沒空格,scanf()將讀取標准輸入流中的第一個字元,%c前有空格,scanf()則讀取標准輸入流中第一個非空白字元,屏蔽了空白字元。
scanf
C語言中常用的標准輸入輸出函數,它的常規用法是scanf(「輸入格式」,輸入地址),scanf從輸入緩沖區取入數據按照指定的「輸入格式」存儲到指定的「輸入地址」。
但是有一類問題通常令人頭疼,那就是字元串的讀入,此處僅僅討論使用scanf讀取字元串的一些問題。理論上你只需要定義一個字元指針,然後scanf每次讀入字元存儲到該指針所指的存儲空間,之後指針值自動加1。