我使用函数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]的值......就像输出一样 - 这是一个长僧......
如果您想了解更多信息,请与我们联系。提前谢谢。
答案 0 :(得分:1)
您的数组声明应该是相反的。
目前您拥有:acctdes[31][20]
,这意味着31
占有者20
每个字符长度;而你想要20个占位符,每个31个字符长度。
应更改为acctdes[20][31]
答案 1 :(得分:1)
“我正在使用函数gets()来检索用户的字符串输入。”
这是你的问题,或者至少是它的一部分。
从不使用gets()
功能。除非您完全控制stdin
上显示的输入,否则它本质上是不安全的。它没有机制来指定接受多少个输入字符。如果用户输入的数据多于目标数组中的数据,则程序的行为未定义。
改用fgets()
;它需要一个参数来指定目标缓冲区的大小。您仍然需要处理输入行太长的可能性(在这种情况下,fgets()
只存储部分行)。如果输入行不是太长,fgets()
会将'\n'
留在缓冲区中,与gets()
不同。
它已经从最新的(2011)ISO C标准中删除了。
(另见其他答案。)
答案 2 :(得分:0)
您的阵列尺寸已颠倒过来。试试acctdes[20][31]
。
字符串相互渗透的原因是因为C将二维数组布置为一个长存储器块。当你acctdes[2]
真正做引导算法时,*(acctdes + (31 * 2))
会跳过内存块的第一部分来到达你的第三个元素。因此,如果一个字符串写入超出其边界,它将最终出现在下一个字符串中。