簡體   English   中英

我在字符串中有問題,在使用 get 函數時,在 c 語言中

[英]I have problem in string, in using the gets function, in c language

我在我們知道的c語言中字符串有問題,該字符串被稱為空終止字符**數組,在字符串中,我們聲明這個字符串存儲了多少個字符。 字符的內存為1byte。 當我們聲明字符名稱[5]時; 這意味着字符串存儲至少 4 個字符的值和空值。

但是強文本存在問題,獲取功能。 當我們輸入包含超過 5 個字符的名稱時,它會被接受並打印所有字符。 在這種情況下,編譯器不會拋出警告。

請告訴我解決方法......代碼如下。

#include<stdio.h>

int main()
{
    char name[4]="smti prajapati";

    printf("Print the name througth the initilizing : ");
    puts(name);


    printf("Enter the name : ");
    gets(name);
    printf("Print the name througth the user : ");
    puts(name);

    return 0;
}

在終端程序中,看起來像這個錯誤

rough.c: In function 'main':
rough.c:5:18: ***warning: initializer-string for array of chars is too long***
     char name[1]="smti prajapati";
                  ^~~~~~~~~~~~~~~~
Print the name througth the initilizing : s3
Enter the name : smit prajapati
Print the name througth the user : smit prajapati

您已將name數組聲明為具有單個元素; 它不足以容納字符串"smti prajapati" 您需要將name聲明為至少15 個元素寬 - 字符串中的 14 個字符加上零終止符。

您可以省略聲明中的大小並寫入

char name[] = "smti prajapati";

數組大小將取自初始化程序的大小。

請注意, name的大小在定義后是固定的,並且無法存儲比初始化程序更長的字符串。

不要使用gets 如果您輸入的字符串對於數組來說太長,它會將這些額外的字符寫入數組后面的任何內容。 這稱為緩沖區溢出,可能導致數據損壞、運行時錯誤或分支到程序中的隨機位置等任何事情。 緩沖區溢出是一種常見的惡意軟件利用。 請改用fgets ,因為它允許您限制寫入目標的字符數。

聲明和賦值:

char name[1] = "smti prajapati";

永遠無法工作,因為您將一個包含 14 個字符的字符串加上空字節分配給一個只有 1 個字符的空間的 char 數組。

某些格式錯誤的代碼不會出現錯誤或警告的原因可以通過 C 給程序員的余地來解釋,由於某些類型的格式錯誤的代碼(例如您自己的代碼),編譯器不會被強制發出警告,這屬於未定義行為的類別,由程序員來避免它。

你可以使用:

char name[] = "smti prajapati";

這樣,數組的大小將在初始化時推導出來。

或者,如果您想明確使用尺寸:

char name[15] = "smti prajapati";

請注意,我為空字節添加了一個額外的空間,如果您想將name作為正確的字符串處理,這是強制性的。 還要注意,一旦給了 char 數組一個大小,它就不會改變,所以當你在name存儲其他字符串時,請記住這一點。


另一個問題是gets ,你不應該使用它,它是一個非常危險的函數,它不檢查目標緩沖區的邊界,因此很容易導致緩沖區溢出,從而導致各種麻煩 最近的編譯器甚至不再支持它,因為它已被棄用,后來從 C 標准中刪除。

即使那些仍然支持它的人也經常發出類似於以下內容的警告:

警告:`gets' 函數是危險的,不應使用。

下面是兩個現代編譯器在使用時的輸出示例

總結和總結,使用fgets代替:

fgets(name, sizeof name, stdin);

當您在 C 中使用數組時,您使用的是固定的內存空間。 如果我想保存“Hello World!” 在內存中,我必須保留一個長度為 13 的數組。在 C 中它看起來像:

char aString[13] = "Hello World!"

它可能高達 20,但不會低於 13。為什么? 字符串具有我們關心的字符,最后一個是空字符(其值為 0)。 因此,您需要保留 13 個字符。

在您的代碼中,您只保留了 1 個字節(1 個字符)。 至少,您必須保留 15 個字節。

試試這個代碼:

#include<stdio.h>

int main()
{
    char name[15]="smti prajapati";

    printf("Print the name througth the initilizing : ");
    puts(name);


    printf("Enter the name : ");
    gets(name);
    printf("Print the name througth the user : ");
    puts(name);

    return 0;
}

我編譯代碼沒有問題。 此外,您可以不指定長度,它會正常工作。 最好的解決方案是動態內存。 避免gets()。 它有安全問題。 相反,使用 fgets()。

你有很多誤解。 讓我們按順序看看它們。

在我們知道的 c 語言中,字符串被稱為空終止字符**數組

在 C 中,字符串是以空char結尾的char數組。 使用字符指針char *來引用字符串是很常見的。 當你說“character**”時可能是一個錯字,但類型char **是一個指向指針的指針,這是別的東西。

當我們聲明字符名稱[5]時; 這意味着字符串存儲至少 4 個字符的值和空值。

正確的。

char name[1]="smti prajapati";

這是不正確的。 您的編譯器正確警告您: warning: initializer-string for array of chars is too long

當我們輸入包含超過 5 個字符的名稱時,它會被接受並打印所有字符。

正確的。 有時,當您違反規則時,您就可以逃脫懲罰。

在這種情況下,編譯器不會拋出警告。

正確的。 C 並不總是檢測或抱怨緩沖區溢出。 通常,您有責任確保為您嘗試存儲在其中的字符串分配足夠大的數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM