c 為什麼s會出現問題,c 問題,為什麼scanf s ,str 這樣是錯的,我定義是string str的

時間 2022-05-28 17:00:05

1樓:匿名使用者

1你輸入和輸出的都是字元

那麼這個陣列肯定要定義成字元型陣列:

char str[1];

2str[0]是乙個字元型指標

而傳給scanf和printf的引數都應該是位址直接str即可

3初始化的時候,str[1]已經限定了長度是1那麼這時候你再賦值多個字元,程式是不會報錯,且可以執行的但在真正的程式設計時這是需要絕對避免的——你應該經常在黑客論壇或相關的安全技術論壇聽到「溢位漏洞攻擊」的說法。而你這種定義了較短長度的容器而被賦值了較長的內容,就是「溢位漏洞」!你現在這個程式中可能看不出什麼來,但一旦這段**被放到了乙個較大型的程式中,很可能被利用——輕則程式崩潰,重則成為黑客或病毒的傀儡。

整個**改為:

#include

void main()

2樓:

str[1]就只有1個位元組的長度,'a』也就1個位元組,%c就只輸出1個位元組的東西,但%s就不行了,陣列越界了,結果不定

3樓:匿名使用者

不知道你用的是那款編譯器, 你第乙個程式本身就用問題。

這涉及到初始化以及強制轉換................

下面是我用vs2010 編譯時出現的問題.

警告 1 warning c4996: 'scanf': this function or variable may be unsafe.

consider using scanf_s instead. to disable deprecation, use _crt_secure_no_warnings. see online help for details.

h:\c++文件\112\112\11.cpp 6

警告 2 warning c4700: 使用了未初始化的區域性變數「str」 h:\c++文件\112\112\11.cpp 6

4樓:

第乙個程式就錯了scanf("%c", &str[0]);

這兒加位址。

還有 最好是char str[1],你輸入字元時候,最好是定義char型,我試了下 int也可以,至於為什麼,不清楚了,我也是第一次看到

5樓:未王艮

當你用printf("%s", str[0]);的時候 給乙個位址即可printf("%s", str);而且要注意str陣列要足夠大

6樓:開國玩

%s是字串,"a"佔兩個位元組,%c是字元'a'佔乙個位元組

改為int str[2];

c++問題,為什麼scanf("%s",str);這樣是錯的,我定義是string str的

7樓:

scanf是c語言,string 是類(c++)。不能直接賦值吧可以這樣:

char buf[1024];

string s;

scanf("%s",buf);

s=buf;

最好不要混合使用c和c++的io庫。直接用cin#include

#include

using namespace std;

string s;

cin >> s;

8樓:匿名使用者

因為是scanf(%s)你這個是要給乙個char*型別的讀取,而不是給string型別的,你引用的引數是string型別的,必須是錯誤的啊

9樓:匿名使用者

既然是c++,就沒必要搞得不c,又不是c++的

直接用 cin>>str;

scanf("%s",str); //還需新增標頭檔案 #include

10樓:撿到的幸福

改成char str[100]就行了

c++裡的%s 是什麼意思?

11樓:小甜甜愛亮亮

輸入輸出中的格式控制,和%d,%f的用

法類似。

c語言中的資料型別沒有字串型,

但是它提供了進行整串輸入和輸出的

格式說明符%s.

如:char str[10];

scanf("%s",str);通過鍵盤輸入乙個字

符串到str中

printf("%s",str);輸出這個字串。

語言特點

支援資料封裝和資料隱藏

在c++中,類是支援資料封裝的工具,物件則是資料封裝的實現。c++通過建立使用者定義類支援資料封裝和資料隱藏。

在物件導向的程式設計中,將資料和對該資料進行合法操作的函式封裝在一起作為乙個類的定義。物件被說明為具有乙個給定類的變數。每個給定類的物件包含這個類所規定的若干私有成員、公有成員及保護成員。

完好定義的類一旦建立,就可看成完全封裝的實體,可以作為乙個整體單元使用。類的實際內部工作隱藏起來,使用完好定義的類的使用者不需要知道類是如何工作的,只要知道如何使用它即可。

支援繼承和重用

在c++現有類的基礎上可以宣告新型別,這就是繼承和重用的思想。通過繼承和重用可以更有效地組織程式結構,明確類間關係,並且充分利用已有的類來完成更複雜、深入的開發。新定義的類為子類,成為派生類。

它可以從父類那裡繼承所有非私有的屬性和方法,作為自己的成員。

支援多型性

採用多型性為每個類指定表現行為。多型性形成由父類和它們的子類組成的乙個樹型結構。在這個樹中的每個子類可以接收乙個或多個具有相同名字的訊息。

當乙個訊息被這個樹中乙個類的乙個物件接收時,這個物件動態地決定給予子類物件的訊息的某種用法。多型性的這一特性允許使用高階抽象。

繼承性和多型性的組合,可以輕易地生成一系列雖然類似但獨一無二的物件。由於繼承性,這些物件共享許多相似的特徵。由於多型性,乙個物件可有獨特的表現方式,而另乙個物件有另一種表現方式。

工作原理

c++語言的程式因為要體現高效能,所以都是編譯型的。但其開發環境,為了方便測試,將除錯環境做成解釋型的。即開發過程中,以解釋型的逐條語句執行方式來進行除錯,以編譯型的脫離開發環境而啟動執行的方式來生成程式最終的執行**。

[9]生成程式是指將原始碼(c++語句)轉換成乙個可以執行的應用程式的過程。如果程式的編寫是正確的,那麼通常只需按乙個功能鍵,即可搞定這個過程。該過程實際上分成兩個步驟。

第一步是對程式進行編譯,這需要用到編譯器(compiler)。編譯器將c++語句轉換成機器碼(也稱為目標碼);如果這個步驟成功,下一步就是對程式進行鏈結,這需要用到鏈結器(linker)。鏈結器將編譯獲得機器碼與c++庫中的**進行合併。

c++庫包含了執行某些常見任務的函式(「函式」是子程式的另一種稱呼)。例如,乙個c++庫中包含標準的平方根函式sqrt,所以不必親自計算平方根。c++庫中還包含一些子程式,它們把資料傳送到顯示器,並知道如何讀寫硬碟上的資料檔案。

12樓:廉嗣召冷玉

1、取模運算即求餘運算

例如:a=5%3

則a=2;

b=1%3

則b=1

2、格式化輸出的時候表示字串

c++中定義char name[20]後,為什麼用printf("%s",name)就能輸出一連串字串?

13樓:匿名使用者

%s代表bai字串,name是字元陣列

的首位址du,也就是字串zhi的首位址。dao所以直接專輸出字串。

c++中定義屬char型陣列即是定義c風格字串。

格式化輸出函式printf第乙個引數中%s代表可變引數部分中對應位置變數為指向字串位址的指標。

在c/c++中陣列的名是儲存該陣列首位址的常量。

需要注意:

(1)c++中定義內建型別區域性陣列變數,不提供預設初始化。這裡char是內建型別,如果不初始化其中儲存的是記憶體中的隨機數。

(2)c++不會對陣列進行越界檢查,而是將越界交給os,如果os檢測記憶體不可讀或寫,對齊進行讀寫os核心會丟擲中斷異常。

(3)c++中c-style字串讓然是以'\0'空字元為結束標誌。printf中的%s仍然會在輸出的時候從name指定的記憶體位置開始讀取資料再交給現存快取以在顯示器上顯示。不初始化或不以'\0'結尾的字串將輸出亂碼,這是如果越界讀取到了不可讀的記憶體,將會報段錯誤(unix核心)或記憶體不可讀(windows)異常以終端程式。

14樓:

%s的概念 就是輸出字串

字串必須要以'\0'結尾

也就是如果你

的name[20]中有乙個位置是'\0'的話專printf("%s",name)就能正確輸出如果你是這樣屬char name[20]=;由於name陣列中沒有'\0'你對name指標用printf函式就會出錯

15樓:匿名使用者

%s是從起始位置輸出字元直到遇到\0為止,合法,

陣列在函式中做實參時會轉成指標。

16樓:匿名使用者

1,%s 是輸出字串;%c,只輸出單個字元。

2, 定義name是陣列,name表示陣列的第乙個字元的位址

17樓:匿名使用者

陣列傳遞給printf函式當引數時,自動退化成指標,printf函式輸出指標指向空間,預設到'\0',結束,所以合法

18樓:wang非在心上

這個復就不需問為什麼啦!!因制為這是它的功能bai啦!!就像1+1為什麼等於du2了。你只需要zhi記住它的作用就是dao 用來輸出資料的!!

那個%s是格式識別符號啦!!就是規定後面的引數是以怎樣的格式輸出的!!另外還有其他幾種常用格式識別符號,%c、%d、%o

19樓:匿名使用者

printf函式本來就是c中的函式 。。

為什麼c++程式執行後出現乙個極大負數???**出現問題???

C語言問題為啥會出錯,c語言執行出錯什麼原因

陽光的雷咩咩 printf d z 璐人釔 printf d z 這樣 c語言執行出錯什麼原因 歡樂多 for i 0,sum 0 i 10 i,sum i 另外main 打錯了 編譯沒有錯是因為你寫的mian函式的語句符合c規範,而連結有錯誤是因為c必須有一個入口函式或叫主函式main 而你這裡卻...

電腦開機出現問題0 c0000001,該怎麼辦?

藍屏的原因有很多種,包括軟體 硬體間的相容性問題,或者硬體故障等。1 請您確認每次藍屏的報錯 是否一致,如果一致,您可以確認藍屏 並通過藍屏 進行簡單排查。2 若是bios下使用正常,藍屏出現在系統使用過程中,可進入系統的安全模式執行,看機器是否出現藍屏,判斷是否與加裝的應用程式有關 若安全模式正常...

C編譯出現問題缺少using指令或程式集引用怎麼解決

你這種問題大至是粗心造成的 1,檢查你要using 對應的namespace 名是否存在.2,如果存在請檢查你當前專案是否引用對應的namespace 生成的dll或者類 譯音 本切成的dll或者類 c 中做頁面跳轉是說缺少using指令或程式集引用怎麼解決 沒猜錯的話你的form1應該是個窗體類!...