下面是要求用戶 輸入一個名一個程序,然後在同一時間打印出名字一個字母 ,最終產生全名。 我有兩個版本的程序。在 下面會出現一個奇怪的現象:如果我輸入的內容類似 jkljljkliunionnklsaa
,它只會產生jkljljkl
。字符數組與scanf函數:不受限制的字符數組沒有給出正確的結果
但是,如果我限制char name[40]
,然後鍵入相同的名稱,程序會顯示整個名稱。 我在程序中做了什麼錯誤,不允許它產生全名?
#include <stdio.h>
#include <string.h>
int main (void)
{
int i, s;
char name[s];
printf ("Type a name: ");
scanf ("%s", name);
for (i = 0; i < strlen(name); i++)
{
printf ("%c", name[i]); // print the i-th character of name
}
printf("\n");
}
首先,**從不寫** scanf(「%s」,...)「。當用戶輸入到數組中時,它會讀取儘可能多的非空白字符,而且這個字符不是無限大。如果您的名稱數組長度爲10個字符,並且用戶輸入了20個字符的單詞,那麼您的程序將崩潰或更糟。更糟的是,我的意思是惡意用戶可以控制你的程序並運行他們自己的代碼,在這種情況下,這是一種基於棧的緩衝區溢出。以字符串形式讀取用戶輸入的正確方法是使用'fgets()'。用'fgets(name,sizeof(name),stdin)替換你的代碼;'。這將讀取一行。 – C0deH4cker
謝謝。我正處於學習編程的第一步。我仍然需要學習你建議的功能。很高興做到這一點。我是否正確理解,如果我使用scanf,我應該總是限制可能條目的數量,就像我對名稱[40]所做的那樣? – Ducol