【问题标题】:Passing a local static array to a function将本地静态数组传递给函数
【发布时间】:2015-10-16 13:29:09
【问题描述】:

我正在尝试从函数letter_remover 传递一个本地数组,该函数读取一个原始数组,删除元音 + h、w 和 y,然后将其复制到一个新数组中。然后将这个新数组传递给 main。

例如,输入 plutonium 将变为 pltnm。但是,当我在 main 中调用该函数并打印出新数组时,它会重复一些字母,例如打印plltnm

void array_filler (char a[]);
char * letter_remover (char b[]);

int main (void)

{
char name[MAX];
char *p;
int i;
array_filler(name);
p = letter_remover(name);
printf("Local array passed back: ");
for (i = 0; i < MAX; i++)
    {
    printf("%s", p);
    p++;
    }

return 0; 

}

如果我打印在函数letter_remover 中创建的新数组,它会正确打印。 letter_remover 函数将新数组创建为静态 char[] 数组并返回 char *

array_filler 包含:

void array_filler (char a[])

{
printf("Type name: ");
int i = 0, c;
while ((c = getchar()) != '\n')
    {
        c = tolower(c);
        if (isalpha(c))
            {
                a[i] = c;
                i++;
            }
    }
a[i] = '\0';
printf("Name inside array: %s\n", a);

}

letter_remover 包含:

char * letter_remover (char b[])

{

int i;
static char c[MAX];
char a[] = "aeiouywh";
printf("Name without forbidden characters: ");
for (i = 0; b[i] != '\0'; i++)
{
    if (!strchr(a, b[i]))
    {
        c[i] = b[i];
        printf("%c", c[i]);
    }
}
c[i] = '\0';
printf("\n");
return c;
}

【问题讨论】:

  • 什么是“本地数组”?
  • array_fillerletter_remover的内容是什么?
  • @MikeCAT 已经是静态数组了
  • @dbush 我现在已经添加了他们的内容。
  • main 函数中的for 循环看起来很奇怪。为什么不只打印一次p

标签: c arrays static


【解决方案1】:

主要是,你可能想说

for (i = 0; i < MAX; i++)
    {
    printf("%c", p[i]);
    p++;
    }

为了打印 p 中的每个字符。由于这将输出超出 0 字符,因此更好的方法是简单地说 printf("%s", p);,而不使用循环。或者只是 printf(p); 如果您信任该字符串!或者puts(p); 显然也会打印一个换行符,这很可能是终端所需要的。

【讨论】:

    【解决方案2】:

    您在 c 中的数组索引在每次循环时都会增加...而您只需在实际复制合法字符时将索引更改为 c。

    for (j = 0, i = 0; b[i] != '\0'; i++)
    {
        if (!strchr(a, b[i]))
        {
            c[j] = b[i];
            j++;
            printf("%c", c[j]);
        }
    }
    c[j] = '\0';
    

    【讨论】:

      【解决方案3】:

      主要问题在这里,在letter_remover

      for (i = 0; b[i] != '\0'; i++)
      {
          if (!strchr(a, b[i]))
          {
              c[i] = b[i];
              printf("%c", c[i]);
          }
      }
      c[i] = '\0';
      

      您对bc 使用相同的索引。因此,在循环结束时,c 在删除字母的位置包含 NULL 字节(因为数组是静态的,所以它被初始化为全零)。写入时需要为c 使用单独的索引:

      for (i = 0, j = 0; b[i] != '\0'; i++)
      {
          if (!strchr(a, b[i]))
          {
              c[j] = b[i];
              printf("%c", c[j]);
              j++;
          }
      }
      c[j] = '\0';
      

      然后main 打印结果:

      for (i = 0; i < MAX; i++)
      {
          printf("%s", p);
          p++;
      }
      

      您从每个字符开始重复打印完整的字符串。所以第一次通过它在它到达 NULL 字节之前打印“pl”,下一次它从“l”开始并在它到达 NULL 字节之前再次打印,依此类推。

      应用第一个修复程序后,您只需打印一次即可:

      printf("%s", p);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-25
        • 2012-07-30
        • 1970-01-01
        相关资源
        最近更新 更多