C编程:gets()和Char String Array问题 - strcpy()复制到Array中的其他字符串

时间:2012-12-02 17:32:07

标签: c arrays string gets

我使用函数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]的值......就像输出一样 - 这是一个长僧......

如果您想了解更多信息,请与我们联系。提前谢谢。

3 个答案:

答案 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))会跳过内存块的第一部分来到达你的第三个元素。因此,如果一个字符串写入超出其边界,它将最终出现在下一个字符串中。