繁体   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