2015-02-05 7 views
0
void tr_str(char s[], char news[]){ 
int c; 
size_t k =0; 
    while ((c = getchar()) != EOF) 
    { 
     for(k=0; k < strlen(s);k++) 
     {     
      if(c == s[k]) 
      { 
       c = news[k]; 
      } 
     } 
     putchar(c); 
    } 
} 

Это моя функция перевода, которая в настоящее время принимает два аргумента из командной строки и использует эти буквы для переключения первого набора на второй набор. Я просто нашел проблему, когда она не работает, если два аргумента различной длины. Что должно произойти, если 1-й аргумент имеет длину 3 символа, а второй - длину 2 символа, второй аргумент получает третий символ, добавленный к нему, и он должен быть равен последнему символу, хранящемуся в нем. Пример: arg1 (a, b, c); арг2 (х, у); При использовании arg2 становится arg2 (x, y, y);Выполнение пользовательских функций tr.c

Благодарим за помощь.

+0

Посмотрите на 'strstr()', 'strchr()', 'strspn()'? – EOF

+0

спасибо за подсказку. – TheUnknown

+0

Ни одна из этих функций не идеальна, так как вам действительно нужна функция, которая является 'size_t indexof (char * haystack, int needle)', но лучшее, что вы получаете, это 'char * strchr (char * haystack, int needle)', поэтому вам нужно вычислить индекс, указав указатели. – EOF

ответ

1

Если вы просто хотите, чтобы ваш код работал без какой-либо оптимизации, вам нужно сравнить k с strlen (новостями) перед тем, как выбрать char в новостях. Он предполагает, что в новостях есть хотя бы один символ.

void tr_str(char s[], char news[]){ 
int c; 
size_t k =0; 
    while ((c = getchar()) != EOF) 
    { 
     for(k=0; k < strlen(s);k++) 
     {     
      if(c == s[k]) 
      { 
       if (k >= strlen(news)) 
        c = news[strlen(news) - 1)]; 
       else 
        c = news[k]; 
       break; // Need a break here, else c could be found again in s and translated again. 
      } 
     } 
     putchar(c); 
    } 
} 

Repetiting последний символ в новостях, чтобы предотвратить тест repetiting в цикле это хорошая идея, но вы не должны непосредственно изменять новости [], за исключением, если вы уверены, что в любом случае новость заключается в доступная для записи достаточно большая память, и даже тогда она по-прежнему является плохой практикой ИМО. Сделайте копию новостей и работайте с ним лучше.

void tr_str(char s[], char news[]){ 
int c; 
size_t k = 0; 
size_t sSize = strlen(s); 
size_t newsSize = strlen(news); 
char *newsCopy; 
int preventsMemoryLeak = 0; 

    if (newsSize < sSize) 
    { 
     // Duplicates news in a large enough memory. No need a zero at end of this copy. 
     newsCopy = malloc(sSize); 
     memcpy(newsCopy, news, newsSize); 
     // Fills the remaining with a copy of the last char 
     memset(newsCopy + newsSize, news[newsSize - 1], sSize - newsSize); 

     preventsMemoryLeak = 1; 
    } 
    else 
    { 
     newsCopy = news; 
    } 

    while ((c = getchar()) != EOF) 
    { 
     for(k = 0; k < sSize; k++) 
     {     
      if(c == s[k]) 
      { 
       c = newsCopy[k]; 
       break; 
      } 
     } 
     putchar(c); 
    } 

    if (preventsMemoryLeak == 1) free(newsCopy); 
} 
Смежные вопросы