2015-10-16 5 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 создает новый массив как статический полукокса [] массив и возвращает символ *

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 char, лучшим способом было бы просто сказать printf("%s", p);, без цикла. Или просто printf(p);, если вы доверяете строке! Или puts(p);, который, очевидно, также напечатает новую строку, что, скорее всего, желательно для терминала.

+0

Удивительное спасибо :)! –

2

Ваш индекс массива, в с, увеличивается каждый раз, когда вы обходите цикл ... вместо этого вам нужно только изменить индекс на 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'; 

Вы используете один и тот же индекс для b и c. Таким образом, в конце цикла 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» до того, как он набрал NULL-байты, в следующий раз, когда он начнется с «l», и распечатает его еще до того, как он ударит байт NULL и т. Д.

После применения первого исправления, все, что вам нужно сделать, это распечатать несколько раз:

printf("%s", p);