【问题标题】:C Programming : gets() and Char String Array Issue - strcpy() copying into other strings in the ArrayC 编程:gets() 和 Char 字符串数组问题 - strcpy() 复制到数组中的其他字符串
【发布时间】:2012-12-02 17:32:07
【问题描述】:

我正在使用函数 gets() 来检索用户输入的字符串。然后我将该字符串存储到一个字符数组 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] 的值...比如输出 - 这是一个长和尚...

如果您想了解更多信息,请告诉我。提前致谢。

【问题讨论】:

  • transcntr 为零时,您还将访问acctdes[-1],它属于acctdes 数组。
  • 请执行谷歌搜索“莫里斯蠕虫”提示:strlen() 不会救你。
  • 从不使用gets()。它的接口已经无法修复,并且已从最新的 C 标准中删除。请改用fgets()

标签: c arrays string gets


【解决方案1】:

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

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

应该改成acctdes[20][31]

【讨论】:

  • 是的,它解决了这个问题。谢谢!干杯.. :)
【解决方案2】:

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

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

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

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

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

(另见其他答案。)

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-14
      • 1970-01-01
      • 2011-04-23
      • 1970-01-01
      • 2013-03-17
      • 2013-02-26
      相关资源
      最近更新 更多