[英]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.