簡體   English   中英

C編程:gets()和Char String Array問題 - strcpy()復制到Array中的其他字符串

[英]C Programming : gets() and Char String Array Issue - strcpy() copying into other strings in the Array

我正在使用函數gets()來檢索用戶的字符串輸入。 然后我將該字符串存儲到char數組,char transdestmp [DESMAX],其中DESMAX為31.如果variable_name大於30個字符,則要求用戶租用另一個字符串。 否則,使用strcpy()將字符串復制到二維數組char - acctdes [31] [20]。

accttitle收到transdestmp [DESMAX]

void accttitle(char descr[DESMAX])
{
    printf("\nEnter title for new account %d: ", transinpt);
    gets(descr);
    while(strlen(descr)>DESMAX){
        printf(" **Title entered is longer than 30 characters\n");
        printf(" Please reenter : ");
        gets(descr);
    }
    strcpy(acctdes[transcntr],descr);
    printf("---->vacctdes[transcntr]: %s\n", acctdes[transcntr]);
    printf("---->vacctdes[transcntr-1]: %s\n", acctdes[transcntr-1]);
}

出於某種原因,當我輸入一個長字符串,然后輸入另一個字符串時,第二個字符串的一部分acctdes [1]會覆蓋存儲在acctdes [0]中的另一個字符串。

例如,

第一個輸入:acctdes [0] =“這是一個長字符串”

有用...

第二個輸入acctdes [1] =“猴子”

有用...

但是,似乎當我輸出acctdes [0]時,acctdes [0]有一些來自acctdes [1]的值......就像輸出一樣 - 這是一個長僧......

如果您想了解更多信息,請與我們聯系。 提前致謝。

您的數組聲明應該是相反的。

目前你有: acctdes[31][20] ,這意味着31占位符,每個20字符長度; 而你想要20個占位符,每個31個字符長度。

它應該改為acctdes[20][31]

“我正在使用函數gets()來檢索用戶的字符串輸入。”

這是你的問題,或至少是其中的一部分。

永遠不要使用gets()函數。 除非您完全控制將在stdin顯示的輸入,否則它本質上是不安全的。 它沒有機制來指定接受多少個輸入字符。 如果用戶輸入的數據多於目標數組中的數據,則程序的行為未定義。

請改用fgets() ; 它需要一個參數來指定目標緩沖區的大小。 您仍然需要處理輸入行太長的可能性(在這種情況下, fgets()只存儲部分行)。 如果輸入行不是太長, fgets()會在緩沖區中留下'\\n' ,與gets()不同。

它已經從最新的(2011)ISO C標准中刪除了。

(另見其他答案。)

您的陣列上的尺寸已反轉。 嘗試acctdes[20][31]

字符串相互滲透的原因是因為C將二維數組布置為一個長存儲器塊。 當你做acctdes[2]它真的在引擎蓋下像*(acctdes + (31 * 2))跳過內存塊的第一部分來到你的第三個元素。 因此,如果一個字符串寫入超過其邊界,它將最終在下一個字符串中。

暫無
暫無

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

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