0

I am using the function gets() to retrieve string input from the user. I then store that string into a char array, char transdestmp[DESMAX], where DESMAX is 31. If the variable_name is greater than 30 chars, then ask the user to renter another string. Else, copy the string using strcpy(), into a 2 dimensional array char - acctdes[31][20].

accttitle recieves 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]);
}

For some reason when I input a long string, and then enter another string, apart of the second string acctdes[1] overwrites the other string stored in acctdes[0].

for example,

First input: acctdes[0] = "This is a long string"

It works...

Second input acctdes[1] = "monkey"

It works...

but then, it seems that when I output acctdes[0], acctdes[0] has some of the value from acctdes[1]... like output - This is a long monk...

Please let me know if you would like more information. Thanks in advance.

4

3 回答 3

1

你的数组声明应该是相反的。

目前你有 : acctdes[31][20],这意味着每个字符长度31的占位符;20而您需要 20 个占位符,每个占位符长度为 31 个字符。

应该改为acctdes[20][31]

于 2012-12-02T17:35:42.320 回答
1

“我正在使用函数 gets() 来检索用户输入的字符串。”

那是你的问题,或者至少是部分问题。

永远不要使用该gets()功能。除非您完全控制将出现的输入内容,否则它本质上是不安全的stdin。它没有指定将接受多少个输入字符的机制。如果用户输入的数据多于目标数组的容量,则程序的行为是未定义的。

改为使用fgets();它需要一个参数来指定目标缓冲区的大小。您仍然必须处理输入行太长的可能性(在这种情况下,fgets()只存储部分行)。如果输入行不太长,fgets()则将'\n'留在缓冲区中,与gets().

太糟糕了,它已从最新的(2011)ISO C 标准中删除。

(另见其他答案。)

于 2012-12-02T20:48:49.203 回答
0

您的阵列上的尺寸颠倒了。试试acctdes[20][31]

字符串相互渗透的原因是因为 C 将二维数组布局为一个长内存块。当您acctdes[2]真正在引擎盖下进行指针运算时,就像*(acctdes + (31 * 2))跳过内存块的第一部分以获取第三个元素。因此,如果一个字符串超出其界限,它将在下一个字符串中结束。

于 2012-12-02T17:40:30.937 回答