㈠ 關於c語言數組輸入問題
scanf()函數根據由format(格式)指定的格式從stdin(標准輸入)讀取,並保存數據到其它參數.scanf()讀取匹配format(格式)字元串的輸入. 當讀取到一個控制字元, 它把值放置到下一個變數. 空白(tabs, 空格等等)會跳過. 非空白字元和輸入匹配, 然後丟棄. 如果是一個在%符號和控制符間的數量, 那麼只有指定數量的字元轉換到變數中. 如果scanf()遇到一個字元集(用%[]控制字元表示), 那麼在括弧中的任意字元都會讀取到變數中. scanf()的返回值是成功賦值的變數數量, 發生錯誤時返回EOF.
getchar()函數從STDIN(標准輸入)獲取並返回下一個字元,如果到達文件尾返回EOF.
所以scanf是根據你後邊括弧里的格式來獲取數據的,比如你的scanf("%d",&a[k]);
如果你輸入2按enter,實際上你的輸入流里邊有兩個字元『0』和enter,scanf就會自動過濾enter將2賦值給a[k],但這時enter還是在你的輸入流里邊的,如果你這時用getchar()它就會獲得enter的值,因為getchar是獲得字元,而你的輸入流里剛好第一個就是enter(2已被scanf取走);
對於 你寫的while((c=getchar())!='\n')
{
scanf("%d",&a[k]);
k++;
}
會先執行c=getchar()在判斷c是不是等於'\n',在執行你的循環體,
如果你輸入123按enter,那麼getchar會先取一個字元『1』賦給c,在判斷c是不是等於'\n',最後執行scanf,將23賦給a[k],
建議樓主初學C時多看源代碼,尤其是庫函數的源代碼,那都是相當基本且經典的程序。如果你用微軟的編譯器可以多看看msdn!希望能解決你的疑惑!
㈡ C語言關與數組的輸入輸出函數
向字元數組c中輸入字元串,它是這樣存儲的:
將字元串中的第一個字元賦給字元數組的第一個元素c[0],第二個字元賦給第二個元素c[1],以此類推。
需要注意的是,當給c[9]賦過值之後,如果在字元串中還有剩餘的字元,程序會繼續命令指針從c[9]處繼續向後移動一個存儲單元的長度(在這里就是一個位元組的長度),並在讀入一個字元並賦給緊挨著c[9]的那個存儲單元,形象一點兒,把它叫做c[10],以此類推,直到讀完所輸入的字元串中的所有字元,並自動加賦'\0'。
這種輸入方式一般也能運行,但是這是十分危險的。因為緊挨在c[9]後面的單元中的內容是不可預料的,它可能是一個空白的存儲空間,也可能已經存放了一個十分有用的數據。如果存儲的是一個有用的數據,越界輸入就會把越界部分原先已有的數據覆蓋掉。
在程序比較小的時候,由於空白地帶比較多,程序往往可以正常運行,但是當程序的規模很大的時候,一旦越界輸入,(越界部分)有用數據被覆蓋掉的可能性就很大了。
最好的方法就是使用scanf("%10s", c); 以限制向字元數組中輸入字元的個數。
㈢ 在c語言中如何實現數組的動態輸入
頭文件malloc.h
使用malloc來申請一個初始地址空間。
然後在循環輸入的過程中不斷檢查初始空間是否已滿,滿了就是使用realloc來擴展地址空間。
最後,如申請的地址不需要使用了,且程序沒有結束,需要用free來釋放。
另外,使用malloc或realloc申請時,需要先判斷下返回值是否為空,如有異常申請失敗,用空指針直接使用,會造成程序錯誤。
下面簡單示範:(初始申請2個位元組,之後每次輸入字元擴展1個位元組,回車結束輸入)
#include <stdio.h>
#include <malloc.h>
int main()
{
int len=2;
char *a=NULL,*aSave=NULL,c;
a=(char*)malloc(sizeof(char)*len);
if(!a)
return 1;
a[0]=0;
while(1)
{
c=getchar();
if(c==10)
break;
if(a[0]==0)
a[0]=c,a[1]=0;
else
{
aSave=realloc(a,sizeof(char)*len);
if(!aSave)
return 1;
a=aSave;
a[len-2]=c,a[len-1]=0;
}
len++;
}
printf("輸入的字元串數組是: %s ",a);
free(a);
return 0;
}
㈣ 關於c語言數組的輸入輸出
scanf("%d
",&a[i]);
%d後面有空格,這樣輸入6個數在輸入一個空格就可以了。
㈤ c語言中的輸入流是什麼意思
可以把流看作是一種數據的載體,通過它可以實現數據交換和傳輸。就像水流是一串水組成的 計算機中的數據流就是由一串數據組成的東西。
C++的輸入輸出流及文件操作
1. C++保留C的輸入輸出單個字元的函數
(1) putchar(c) —— 字元輸出
常式:
#include
using namespace std;
int main()
{
char a,b,c;
a='B'; b='O';c='Y';
putchar(a); putchar(b); putchar(c);putchar('/n');
putchar(66);putchar(79);putchar(89);putchar(10); //10是換行的ASCII碼
return 0;
}
(2) getchar() ——字元輸入函數
常式:
#include
using namespace std;
int main()
{
char c;
c=getchar();
putchar(c+32); //轉化為小寫字母,大小寫之間包括[ / ] ^ - 、6個字元,因此不加26加32。'A'=65
putchar('/n');
return 0;
}
也可用cout來輸出: cout<<(c=getchar()+32);
2. scanf()、printf()函數的輸入和輸出
scanf(格式控制,輸出表列);
printf(格式控制,輸出表列);
常式:
#include
using namespace std;
int main()
{
int a;
float b;
char c;
scanf("%d % c % f", &a,&c,&b);
printf("a=%d, b=%f, c=%c /n",a,b,c);
return 0;
}
3. 標准輸入輸出流cin、cout
包括頭文件#include
輸入輸出流的控制符要加入頭文件 #include
cout<<"dec:"<
cout.put(97); //顯示a字元--使用cout的成員函數put(c)
cin成員函數get()
(1) 不帶參數的
char c=cin.get(); //用cin的成員函數get()從鍵盤讀入一個字元到c中去
(2) 帶一個參數的
cin.get(ch); //從輸入的流中接受一個字元,並賦給字元變數ch
(3) 帶三個參數的
cin.get(字元數組,字元的個數n,終止字元)
常式:
#include
using namespace std;
int main()
{
char ch[20];
cout<<"in put a string:"<
cin.get(ch,10,'/n'); /*取得輸入流的前10-1=9個字元賦值給ch數組的前9個元素,並規定換行符為為輸入流的終止結束符*/
cout<
return 0;
}
如輸入:1 2 34567890 //按換行鍵終止流輸入
則輸出:1 2 34567 //只讀得前9個送入ch數組中
cin的成員函數getline() ——從輸入流中讀入一行字元
cin.getline(字元數組(或字元指針),字元的個數n,終止字元)
常式:
#include
using namespace std;
int main()
{
char ch[20];
cout<<"input a string:"<
cin>>ch;
cout<<"The string read with cin is:"<
cin.getline(ch,20,'/'); //讀取19個字元到ch數組或遇到'/'結束
cout<<"The second part is:"<
cin.getline(ch,20); //讀取19個字元到ch數組或遇到'/n'結束,遇到'/'仍作為字元讀入
cout<<"The third part is:"<
return 0;
}
istream類的其他的成員函數如:eof(),在輸入流中讀取數據,如果到達末尾(遇到文件結束符),則eof()返回真,否則為假.
常式:
#include
using namespace std;
int main()
{
char c;
while(!cin.eof()) //若未遇到文件結束符
if((c=cin,get())!=' ') //檢查讀入的字元是否為空格字元
cout.put(c);
return 0;
}
4. 磁碟文件的打開和關閉
打開
ofstream outfile;
if(outfile.open("f1.data",ios::app)==0) // 打開
cout<<"打開失敗!";
……………………
outfile.close(); //關閉
5. 文件寫入
#include
#include
#include //一定不能少了,否則報錯 error C2679
using namespace std;
int main()
{
string str;
ofstream out("d.txt",ios::out); //等價於ofstream out("d.txt")
if(!out) //若打開失敗,out返回0值
{
cerr<<"打開失敗!"<
exit(0);
}
str="床前明月光/n疑是地上霜/n舉頭望明月/n低頭思故鄉/n";
out< return 0;
}
6. 讀文件到控制台
#include
#include
#include
using namespace std;
int main()
{
ifstream infile("d://new//d.txt",ios::in); //定義輸入文件的流對象,以輸入方式打開磁碟文件d.txt,第二個參數可去
if(!infile)
{
cerr<<"打開失敗!"< exit(1);
}
for(string str;getline(infile,str);) //逐行打開並逐行顯示,因此在循環中實現
cout< infile.close();
return 0;
}
或把 for(string str;getline(in,str);)
cout<
兩句改為 string str;
while(getline(in,str))
cout<
7. 文件復制
#include
#include
#include
using namespace std;
int main()
{
ifstream in("d.txt");
if(!in)
{
cerr<<"打開源文件失敗!"< exit(1);
}
ofstream out("b.txt");
if(!out)
{
cerr<<"打開目的文件失敗!"< exit(1);
}
for(string str;getline(in,str);)
out< cout<<"文件復製成功!"<
in.close();
out.close();
return 0;
}
8. 自定義一個文件讀入的函數 void display( char *filename)
#include
#include
#include
using namespace std;
void display(char *filename)
{
ifstream infile(filename,ios::in);
if(!infile)
{
cerr<<"打開失敗!"< exit(1);
}
char ch;
while(infile.get(ch))
cout.put(ch);
cout< infile.close();
}
int main()
{
display("d.txt");
return 0;
}
9.關於文件讀寫的綜合應用
#include
#include
using namespace std;
//從鍵盤讀入字母並存入文件「d.txt」中
void save_to_file()
{
ofstream ofile("d.txt");
if(!ofile)
{
cerr<<"打開失敗d.txt!"< exit(1);
}
char c[80];
cin.getline(c,80); //從鍵盤逐個讀入一行字元
for(int i=0;c[i]!=0;i++) //對字元逐個處理,知道遇到'/n'結束
if(c[i]>=65 && c[i]<=90||c[i]>=97 && c[i]<=122)
{
ofile.put(c[i]); //將字母存入磁碟文件d.txt
cout< }
cout< ofile.close();
}
//將"d.txt"中的字母轉化為大寫字母並存入"out.txt"中
void get_from_file()
{
char ch;
ifstream infile("d.txt");
if(!infile)
{
cerr<<"打開失敗d.txt!"< exit(1);
}
ofstream outfile("out.txt");
if(!infile)
{
cerr<<"打開失敗out.txt!"< exit(1);
}
while(infile.get(ch)) //逐個讀入字元成功後執行下面的語句
{
if(ch>=97 &&ch<=122)
ch=ch-32;
outfile.put(ch);
cout< }
cout< infile.close();
outfile.close();
}
int main()
{
save_to_file();
get_from_file();
return 0;
}
=========================== C/C++的字元或字元數組的讀入函數總結=====================
1、cin
1、cin.get()
2、cin.getline()
3、getline()
4、gets()
5、getchar()
1、cin>>
用法1:最基本,也是最常用的用法,輸入一個數字:
#include
using namespace std;
main ()
{
int a,b;
cin>>a>>b;
cout<}
輸入:2[回車]3[回車]
輸出:5
用法2:接受一個字元串,遇「空格」、「TAB」、「回車」都結束
#include
using namespace std;
main ()
{
char a[20];
cin>>a;
cout<}
輸入:jkljkljkl
輸出:jkljkljkl
輸入:jkljkl jkljkl //遇空格結束
輸出:jkljkl
2、cin.get()
用法1: cin.get(字元變數名)可以用來接收字元
#include
using namespace std;
main ()
{
char ch;
ch=cin.get(); //或者cin.get(ch);
cout<}
輸入:jljkljkl
輸出:j
用法2:cin.get(字元數組名,接收字元數目)用來接收一行字元串,可以接收空格
#include
using namespace std;
main ()
{
char a[20];
cin.get(a,20);
cout<}
輸入:jkl jkl jkl
輸出:jkl jkl jkl
輸入:abcdeabcdeabcdeabcdeabcde (輸入25個字元)
輸出:abcdeabcdeabcdeabcd (接收19個字元+1個'/0')
3、cin.getline() // 接受一個字元串,可以接收空格並輸出
getline 會將換行符替換為空字元
#include
using namespace std;
main ()
{
char m[20];
cin.getline(m,5);
cout<}
輸入:jkljkljkl
輸出:jklj
接受5個字元到m中,其中最後一個為'/0',所以只看到4個字元輸出;
如果把5改成20:
輸入:jkljkljkl
輸出:jkljkljkl
輸入:jklf fjlsjf fjsdklf
輸出:jklf fjlsjf fjsdklf
//延伸:
//cin.getline()實際上有三個參數,cin.getline(接受字元串的看哦那間m,接受個數5,結束字元)
//當第三個參數省略時,系統默認為'/0'
//如果將例子中cin.getline()改為cin.getline(m,5,'a');當輸入jlkjkljkl時輸出jklj,輸入jkaljkljkl時,輸出jk
當用在多維數組中的時候,也可以用cin.getline(m[i],20)之類的用法:
#include
#include
using namespace std;
main ()
{
char m[3][20];
for(int i=0;i<3;i++)
{
cout<<"/n請輸入第"<cin.getline(m[i],20);
}
cout<for(int j=0;j<3;j++)
cout<<"輸出m["<
}
請輸入第1個字元串:
kskr1
請輸入第2個字元串:
kskr2
請輸入第3個字元串:
kskr3
輸出m[0]的值:kskr1
輸出m[1]的值:kskr2
輸出m[2]的值:kskr3
4、getline() // 接受一個字元串,可以接收空格並輸出,需包含「#include」
#include
#include
using namespace std;
main ()
{
string str;
getline(cin,str);
cout<}
輸入:jkljkljkl
輸出:jkljkljkl
輸入:jkl jfksldfj jklsjfl
輸出:jkl jfksldfj jklsjfl
和cin.getline()類似,但是cin.getline()屬於istream流,而getline()屬於string流,是不一樣的兩個函數
5、gets() // 接受一個字元串,可以接收空格並輸出,需包含「#include」
#include
#include
using namespace std;
main ()
{
char m[20];
gets(m); //不能寫成m=gets();
cout<}
輸入:jkljkljkl
輸出:jkljkljkl
輸入:jkl jkl jkl
輸出:jkl jkl jkl
類似cin.getline()裡面的一個例子,gets()同樣可以用在多維數組裡面:
#include
#include
using namespace std;
main ()
{
char m[3][20];
for(int i=0;i<3;i++)
{
cout<<"/n請輸入第"<gets(m[i]);
}
cout<for(int j=0;j<3;j++)
cout<<"輸出m["<
}
請輸入第1個字元串:
kskr1
請輸入第2個字元串:
kskr2
請輸入第3個字元串:
kskr3
輸出m[0]的值:kskr1
輸出m[1]的值:kskr2
輸出m[2]的值:kskr3
自我感覺gets()和cin.getline()的用法很類似,只不過cin.getline()多一個參數罷了;
這里順帶說明一下,對於本文中的這個kskr1,kskr2,kskr3 的例子,對於cin>>也可以適用,原因是這里輸入的沒有空格,如果輸入了空格,比如「ks kr jkl[回車]」那麼cin就會已經接收到3個字元串,「ks,kr,jkl」;再如「kskr 1[回車]kskr 2[回車]」,那麼則接收「kskr,1,kskr」;這不是我們所要的結果!而cin.getline()和gets()因為可以接收空格,所以不會產生這個錯誤;
6、getchar() //接受一個字元,需包含「#include」
#include
#include
using namespace std;
main ()
{
char ch;
ch=getchar(); //不能寫成getchar(ch);
cout<}
輸入:jkljkljkl
輸出:j
//getchar()是C語言的函數,C++也可以兼容,但是盡量不用或少用;
總結:
1.讀入一行
gets(char a[]); //接受一行,遇回車結束
gets(m[i]) //可用於多維數組中
cin.get(char a[],int 5,'/n') //將字元數組a的前5個字元讀入,遇到換行符結束;比如:a bc12ds,將會讀入4個字元 a bc,外加一個'/0';
// 一般第三個參數不寫,默認為'/0'
eg:
#include
#include
using namespace std;
main ()
{
string str;
getline(cin,str);
cout<}
2.讀入一個字元
getchar() //接受一個字元,需包含「#include」
char ch =getchar();
cin.get(char c) 或者 cin.get()
char ch=cin.get(); 或者cin.get(ch)
getline()和cin.getline()類似,但是cin.getline()屬於istream流,而getline()屬於string流,是不一樣的兩個函數
cin.getline(char a[],int 5,'/n') //將字元數組a的前5個字元讀入,遇換行符結束;如:a bc12ds,將會讀入4個字元 a bc,外加一個'/0';
// 一般第三個參數不寫,默認為'/0'
cin.getline(m[i],20) //可用於多維數組中
getline() // 接受一個字元串,可以接收空格並輸出,需包含「#include"
㈥ C語言中的 輸入流 是什麼意思
首先,你要明白什麼是「流」。直觀地講,流就像水一樣,不存在大小問題,也避免了完整性問題。非流的數據傳輸,比如你下載一張圖片,需要整幅圖片下載完之後才能使用,而流則不同,就像水,你取一杯也可以用,取一桶也可以用。所以說,流是一種數據傳輸的模式。
而輸入流和輸出流,差別在於出和入,是相對於程序而言的。「輸入流式得到數據,輸出流是輸出數據」,這種說法是對的。你把問題想復雜了,輸入是程序得到外部數據,輸出是程序向外部傳輸數據,二者沒有必然的聯系,都是流,差別是方向不同,也就是說,程序可以只有輸入流而沒有輸出流,或者只有輸出流而沒有輸入流。
另外補充一下,流的好處是接收方可以提前處理,縮短等待時間,提高速度。比如你上youku看視頻,並不是整個視頻下載好了才播放的,而是下一點播一點。但是不是所有應用都適合,比如加密了的文件,往往需要整個加密文件接收完了才能解密。
㈦ c語言字元串數組怎麼輸入和輸出呢
在C語言中,有兩個函數可以在控制台(顯示器)上輸出字元串,它們分別是:
puts():輸出字元串並自動換行,該函數只能輸出字元串。
printf():通過格式控制符%s輸出字元串,不能自動換行。除了字元串,printf() 還能輸出其他類型的數據。
這兩個函數相信大家已經非常熟悉了,這里不妨再演示一下,請看下面的代碼:
#include <stdio.h>
int main(){
char str[] = "http://c.biancheng.net";
printf("%s ", str); //通過字元串名字輸出
printf("%s ", "http://c.biancheng.net"); //直接輸出
puts(str); //通過字元串名字輸出
puts("http://c.biancheng.net"); //直接輸出
return 0;
}
運行結果:
http://c.biancheng.net
http://c.biancheng.net
http://c.biancheng.net
http://c.biancheng.net
注意,輸出字元串時只需要給出名字,不能帶後邊的[ ],例如,下面的兩種寫法都是錯誤的:
printf("%s ", str[]);
puts(str[10]);
(7)c語言數組接收輸入流擴展閱讀:
由數字、字母、下劃線組成的一串字元。一般記為 s=「a1a2···an」(n>=0)。它是編程語言中表示文本的數據類型。在程序設計中,字元串(string)為符號或數值的一個連續序列,如符號串(一串字元)或二進制數字串(一串二進制數字)。
字元串在存儲上類似字元數組,它每一位單個元素都是能提取的,字元串的零位是它的長度,如s[0]=10,這提供給我們很多方便,例如高精度運算時每一位都能轉化為數字存入數組。
㈧ 如何在C語言中用scanf輸入數組
#include
main()
struct
int num;
char name[20];
char sex;
int age;
stu[5];
int i;
for(i=0;i<5;i++)
printf("請輸入信息 ");
scanf("%d",&stu[i].num);
scanf("%s",&stu[i].name);
scanf("%c",&stu[i].sex); //在%c之前加一個空格
scanf("%d",&stu[i].age);
for(i=0;i<5;i++)
printf( "*%s*",stu[i].name);
(8)c語言數組接收輸入流擴展閱讀:
函數 scanf() 是從標准輸入流stdin[1](標准輸入設備,一般指向鍵盤)中讀內容的通用子程序,可以說明的格式讀入多個字元,並保存在對應地址的變數中。
函數的第一個參數是格式字元串,它指定了輸入的格式,並按照格式說明符解析輸入對應位置的信息並存儲於可變參數列表中對應的指針所指位置。每一個指針要求非空,並且與字元串中的格式符一一順次對應。
㈨ C語言數組輸入。。
C語言數組輸入是相同類型的、數量有限的若干個變數通過有序的方法組織起來的一種便於使用的形式。數組屬於一種構造類型,其中的變數被稱為數組的元素。數組元素的類型可以是基本數據類型,也可以是特殊類型和構造類型。
在引用數組中的元素時,採用數組名[下標]的方式,將其中的每一個元素視為一個普通的變數來進行操作。需要注意的是,因為定義的數組arr僅含有9個元素,所以在使用的過程中,下標值不能超過8,否則就會出現下標越界的錯誤。
(9)c語言數組接收輸入流擴展閱讀:
注意事項:
由於剩餘的元素會自動初始化為 0,所以只需要給第 0 個元素賦值為 0 即可,只能給元素逐個賦值,不能給數組整體賦值。例如給 10 個元素全部賦值為 1。
注意指針變數的當前值:指針變數的值在程序運行過程中可能經常改變,要對此注意。
數組越界:C語言系統是不檢查數組越界的,需要程序員自行檢查。
㈩ c語言,如何從輸入流里讀取指定字元串
辦法還是不少的。比較正宗的是用鏈表,長度不限,就是有點浪費空間而已。我碰到過此類問題,解決辦法是聲明兩個指針,動態分配內存,當其中一個「裝滿」時用另一個指針分配一個較大些的空間,再把那個「已滿」的內容拷貝過去,交換指針名後在較大的空間上繼續輸入;當然要釋放較小的空間等待重新分配。如此往復,直到輸入結束。缺點是瞬間需要兩倍多一點的空間(但比鏈表要省得多,(而且若只輸入01的話還可以用位處理技術,那就省多了當然麻煩些))。用起來還是很爽的……