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