2015-07-08 2 views
-1

Эта программа предназначена для сравнения строк, но я не могу понять, почему она возвращает то же значение c everytime.Can кто-нибудь поможет мне понять это? Спасибо.Ошибка сравнения строк String Logic Error

int func(char *n,char *m) 
     { 
      int c; 
      c = (int)malloc(sizeof(int)); 
      c=0; 
      while(*n == *m) 
       { 
        if(*n=='\0' && *m=='\0') 
         { 
          int c=1; 
          break; 
         } 
        else 
         { 
          n++; 
          m++; 
         } 
        } 
     printf("%d \n",c); 
     return(c); 
     } 
+0

RIP указатели !!! – haccks

+0

Это даже компилируется? Между прочим, у вас есть несколько значений 'int c' в пределах той же области. Кроме того, почему вы возвращаете malloc() ?. В C это ошибка. – ryyker

+0

Я лучше избавлю меня от предупреждения stnadard («не бросайте' void * '). У вас есть проблемы, которые нужно решить в первую очередь. Хорошим началом будет недавняя книга C. – Olaf

ответ

1

Я считаю, что намерение состоит в том, что функция возвращает
1 для матча
0 для неправильного матча
Значения c устанавливаются в 1 в качестве индикатора, что строки были равный и возвращенный либо на один из m, либо на n, являющийся нулевым. (если они равны, оба будут равны нулю)
Если строки не были равны, c возвращается как инициализированный ->0.

Версия ниже делает это.

Сравните эту версию с оригиналом для предложенных изменений:

1) вам не нужно выделять память для int c; неявно создаются как auto.
2) можно инициализировать в той же строке: int c = 0;
3) не воссоздавать int c в if(...){...} блок
4) Вы хотите, чтобы выйти, если либо *m или *n являются NULL.
5) потому что while гарантирует * m & * n такие же, не нужно проверять оба для NULL. (спасибо @mch комментарий)

int func(char *n,char *m) 
{ 
    int c=0;//1,2, 
    while(*n == *m) 
    { 
     if(*n=='\0') //5, 4 
     { 
      c = 1;//3 
      break; 
     } 
     else 
     { 
      n++; 
      m++; 
     } 
    } 
    printf("%d \n",c); 
    return(c); 
} 
+0

вы можете удалить '|| (* m == '\ 0') ', потому что' * m' должен быть равен '* n' из-за' while'. – mch

+0

@ryyker Спасибо за подробное объяснение. Просто началось с C, так что много ошибок. –

+0

@DhananjayGoel - добро пожаловать. рад помочь. – ryyker

0

Эта функция всегда возвращает 0.

Вы определяете c в верхней и установите его в 0 (значение, возвращаемое malloc перезаписывается). Позже вы определяете новую переменную с именем c во внутренней области, скрывая предыдущее объявление. Таким образом, внешний c никогда не изменяется после установки 0.

Изменить int c=1; на c=1, и это, вероятно, то, что вы ищете. Кроме того, здесь нет необходимости вызывать malloc, поскольку он выделяет динамическую память, а c - это сам int, а не указатель на один.

+0

Hey Thanks.Newbie in C так глупые ошибки тут и там. –

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