2015-06-07 2 views
0

Я использую следующую функцию в C++ для возврата первого символа в заданную строку, которая не повторяется, если не найдена return '@'.Печать первого символа в заданной строке, которая не повторяется

char MyMethod(const char* str, int len){ 
    int i,index=-1; 
    int *count = new int[256]; 

    for(i=0;i<len;i++) 
    { 
     count[*(str+i)]=0; 
    } 

    for(i=0;i<len;i++) 
    { 
     count[*(str+i)]++; 
    } 

    for(i=0;i<len;i++) 
    { 
     if(count[*(str+i)]==1) 
     { 
      index=i; 
      break; 
     } 
    } 

    if(index==-1) 
     return '@'; 
    else 
     return *(str+index); 
} 

Этот метод выглядит нормально, но он всегда возвращает первый символ строки. , например, для следующей строки

aabcdd 

возвращает «а» вместо «Ъ».

+1

Может понадобиться подключить эту утечку памяти, когда вы исправите это, кстати. – WhozCraig

+0

@Levi первый цикл для цикла, устанавливающий все элементы в ноль, второй для подсчета частот в массиве и третий для проверки первого не повторяющегося символа. – toadalskiii

+0

Сторона примечания: заменить 'int * count = new int [256]' на 'int count [256] '. Не нужно выделять его динамически (конечно, когда вы не пытаетесь освободить его в конце). BTW. Более стандартный способ использовать постоянное значение «256» в контексте этого кода будет включать «limits.h» и использовать «1 << CHAR_BIT' вместо этого. –

ответ

2

Я считаю, что была опечатка. Оператор:

if(count[*(str+i)]==1); 

не должно было быть прекращено:

if(count[*(str+i)]==1) 

Удалите точку с запятой, так что операторы после условия if оцениваются только тогда, когда условие истинно. В противном случае утверждения будут оцениваться независимо от результата if.

+0

@ karma_geek..I удали точку с запятой, но она не дает первый не повторяющийся символ – toadalskiii

+0

@toadalskiii: http://ideone.com/0NaMNL. Но он здесь. –

+0

@ karma_geek Я проверил этот cout << MyMethod («zsdfhogfmpsdfgohfghz», 19); в вашей ссылке, но он дает 'z' вместо 'm' – toadalskiii

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