2014-10-28 3 views
-1

У меня есть две функции rmdup и rmvow, когда я выполняю эти функции в изоляции, они работают отлично, но когда они вместе в программе, они вообще не работают?Две функции работают изолированно, но не вместе

int rmdup (char name[]) 
{ 

    char nodup[20] = {''\0''}; 
    int l = strlen(name); 
    int i = 0, j, k = 0; 

    while (i < l) 
    { 
    j = i + 1; 

    if (name[i] == name[j]) 
    { 
     nodup[k] = name[i]; 
     i+2; 
     while(nodup[k] == name[i]) 
     { 
     i++; 
     } 
     k++; 
    } 
    else 
    { 
     i++; 
    } 

    nodup[k] = ''\0''; 
    } 

    strcpy(name, nodup); 
} 

Вышеупомянутые работы изолированы, как показано ниже.

int rmvow (char name[] ) 
{ 
    char novow[20] = {''\0''}; 
    int l = strlen(name); 
    int i = 0, j = 0; 

    while (i < l) 
    { 
    if (name[i] == ''a'' || 
     name[i] == ''e'' || 
     name[i] == ''i'' || 
     name[i] == ''o'' || 
     name[i] == ''u'') 
    { 
     i++; 
    } 
    else 
    { 
     novow[j] = name[i]; 
     i++; 
     j++; 
    } 

    novow[j] = ''\0''; 
    } 

    strcpy(name, novow); 
} 
+0

Пожалуйста, научитесь правильно отступать от своего кода. Это облегчает чтение и отслеживание потока исполнения. Вы не показали, как вы пытаетесь «использовать их вместе в программе», так как нам следует объяснить, почему они не работают? –

+0

Непонятно, что вы можете подразумевать под * «когда они вместе» * или даже * «они вообще не работают» *. Предоставьте код, в котором вы их используете, объясните, когда каждый * должен * и фактические результаты. Ваша компоновка кода в лучшем случае нетрадиционная, и очень трудно читать - если вы хотите, чтобы другие читали ваш код и помогали, вы должны сделать это как можно проще. – Clifford

+0

На каком языке это и почему он помечен 'strcpy'? Это уместно? Что такое '' '\ 0''', '' 'a''' и т. Д.? Они не компилируются как код C, который в этом случае выглядит иначе. – Clifford

ответ

0

Скорректированный и полный код ниже выходов:

aabbccddeeff 
abcdef 
bcdf 

Который кажется правильным. Единственными исправлениями были i += 2 в rmdup() и действительные символьные константы. Скомпилирован как код C при отсутствии какой-либо другой информации.

#include <stdio.h> 
#include <string.h> 

int rmdup (char name[]) ; 
int rmvow (char name[]) ; 

int main(void) 
{ 
    char test[] = "aabbccddeeff" ; 

    printf("%s\n", test) ; 
    rmdup(test) ; 

    printf("%s\n", test) ; 
    rmvow(test) ; 

    printf("%s\n", test) ; 

    return 0; 
} 

int rmdup (char name[]) 
{ 

    char nodup[20] = {'\0'}; 
    int l = strlen(name); 
    int i = 0, j, k = 0; 

    while (i < l) 
    { 
    j = i + 1; 

    if (name[i] == name[j]) 
    { 
     nodup[k] = name[i]; 
     i+=2; 
     while(nodup[k] == name[i]) 
     { 
     i++; 
     } 
     k++; 
    } 
    else 
    { 
     i++; 
    } 

    nodup[k] = '\0'; 
    } 

    strcpy(name, nodup); 
} 

int rmvow (char name[] ) 
{ 
    char novow[20] = {'\0'}; 
    int l = strlen(name); 
    int i = 0, j = 0; 

    while (i < l) 
    { 
    if (name[i] == 'a' || 
     name[i] == 'e' || 
     name[i] == 'i' || 
     name[i] == 'o' || 
     name[i] == 'u') 
    { 
     i++; 
    } 
    else 
    { 
     novow[j] = name[i]; 
     i++; 
     j++; 
    } 

    novow[j] = '\0'; 
    } 

    strcpy(name, novow); 
} 

Однако код опасен, так как там нет никакой защиты от переполнения novow или nodup массивов. Оба они не нужны; в обоих случаях вы можете записать данные непосредственно обратно в name, так как индекс назначения всегда < = исходный индекс.

int rmdup (char name[]) 
{ 

    int l = strlen(name); 
    int i = 0, j, k = 0; 

    while (i < l) 
    { 
    j = i + 1; 

    if (name[i] == name[j]) 
    { 
     name[k] = name[i]; 
     i+=2; 
     while(name[k] == name[i]) 
     { 
     i++; 
     } 
     k++; 
    } 
    else 
    { 
     i++; 
    } 

    name[k] = '\0'; 
    } 
} 

int rmvow (char name[] ) 
{ 
    int l = strlen(name); 
    int i = 0, j = 0; 

    while (i < l) 
    { 
    if (name[i] == 'a' || 
     name[i] == 'e' || 
     name[i] == 'i' || 
     name[i] == 'o' || 
     name[i] == 'u') 
    { 
     i++; 
    } 
    else 
    { 
     name[j] = name[i]; 
     i++; 
     j++; 
    } 

    name[j] = '\0'; 
    } 
} 
+0

Спасибо за помощь, похоже, сейчас работает. –

+0

@ElisJones: Поскольку вы не пытались разъяснить этот вопрос, я искренне сожалею, что даже пытаюсь ответить, чтобы быть честным. – Clifford

+0

Извините? Я пытался написать программу «Soundex», удалил гласные и дубликаты из строки, а затем закодировал оставшиеся буквы. Например, Clifford -> Clffrd -> Clfrd -> C1432. –

Смежные вопросы