将本地静态数组传递给函数

时间:2015-10-16 13:29:10

标签: c arrays static

我试图从函数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;
}

3 个答案:

答案 0 :(得分: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';

答案 1 :(得分:2)

主要是,你可能想说

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

为了打印p中的每个字符。由于这将输出超过0 char,更好的方法是简单地说printf("%s", p);,没有循环。如果您信任该字符串,或者只是printf(p);!或者puts(p);显然也会打印换行符,这对终端来说是最可取的。

答案 2 :(得分:1)

主要问题在于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);