2015-10-16 87 views
0

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

什么是“本地arrray”? – MikeCAT

+0

'array_filler'和'letter_remover'的内容是什么? – dbush

+0

@MikeCAT它已经是一个静态数组了 –

回答

2

在主,你可能想说

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

为了打印每个字符在页。由于这将输出超过0字符,更好的方法是简单地说printf("%s", p);,没有循环。或者只是printf(p);,如果你相信字符串!或者puts(p);,它显然也会打印换行符,这对于终端来说很可能是合乎需要的。

+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

的主要问题是在这里,在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++; 
} 

你反复打印出完整的字符串开始每个角色。所以第一次通过它打印“PL”,然后打到空字节,下一次从“l”开始,在打到空字节之前再打印一次,依此类推。

一旦你申请的第一个定位,你需要做的就是打印一次:

printf("%s", p);