Сравнение chars[] не работает

У меня проблема с функцией strcmp (тот же вопрос здесь, но там не хорошие ответы). Если я сравниваю 2 одинаковые строки, но одна строка из структуры, эта строка неправильно "переводится" в ассемблерный код. Каждый char[] из структуры представляет собой случайные 3 символа. Изображение strcmp.asm

#define CONS 60

typedef struct LinkCity{
    char city[CONS];           // i get this char[] from file by using fgets()
    struct LinkCity* next;
} tLinkCity;
/***************************************/
    typedef struct {
        int NumberOfCity;
        tLinkCity* Link;
        double** distances;
    } tDatabaze;
/***************************************/
int GetIndexOfCity(tDatabaze* db, char * city){

    printf("%s %s", db->Link->city, city); //   > Barcelona\n Barcelona (yes, here is a newline)
    str = strcmp(db->Link->city, city);    //   str = 1  (=it should be 0)
}

person Pivoman    schedule 25.12.2013    source источник
comment
Когда вы извлекали строку с помощью fgets(), не забыли ли вы также удалить символ новой строки в конце? А что такое tSeznamMest и где вообще выделено db->Link? Опубликуйте реальный пример, воспроизводящий проблему, плз.   -  person WhozCraig    schedule 26.12.2013
comment
Какое это имеет отношение к сборке?   -  person Oliver Charlesworth    schedule 26.12.2013
comment
сорри за цэзнаммест, отредактировал...   -  person Pivoman    schedule 26.12.2013
comment
В строках могут быть непечатаемые символы. Что strlen() говорит для двух строк?   -  person Barmar    schedule 26.12.2013
comment
Пожалуйста, опубликуйте код, в котором вы пишете свои два массива символов.   -  person nvoigt    schedule 26.12.2013
comment
Оли: это не файл сборки .asm? :)   -  person Pivoman    schedule 26.12.2013
comment
@Pivoman: Конечно, но какое это имеет отношение к вашему коду? Вы должны просто быть в состоянии описать симптомы с точки зрения C...   -  person Oliver Charlesworth    schedule 26.12.2013
comment
Если ваш вопрос касается вашей собственной функции asm, вы должны опубликовать ее, а не код C.   -  person Barmar    schedule 26.12.2013
comment
это не функция ассемблера, это изображение просто отладки   -  person Pivoman    schedule 26.12.2013


Ответы (2)


попробуйте удалить новую строку с конца строки перед сравнением, вот простая функция для этого:

void removeNLine(char* string)
{
        int i ;
        for(i = strlen(string) ; i > 0 ; i--)
               if(string[i] == '\n')
                     string[i] = '\0';
}
person Farouq Jouti    schedule 26.12.2013

Если я не ошибаюсь, функция fgets также считывает в массив символ новой строки. Поэтому я думаю, что причина того, что два массива не равны друг другу, заключается в том, что тот, который был прочитан с использованием fgets, содержит символ новой строки.

person Vlad from Moscow    schedule 25.12.2013
comment
Новая строка будет напечатана printf(), не так ли? - person Barmar; 26.12.2013
comment
Я знаю, но я пытаюсь скопировать (используя strcpy()), и это тоже не работает. - person Pivoman; 26.12.2013
comment
@Barma, да, это может помочь определить, действительно ли есть новый символ строки. - person Vlad from Moscow; 26.12.2013
comment
@Pivoman Непонятно, что вы пытаетесь скопировать и в чем проблема. - person Vlad from Moscow; 26.12.2013
comment
@VladfromMoscow Тогда почему он не видит новую строку в своем printf? - person Barmar; 26.12.2013
comment
@Barma Я не знаю, видит он это или нет. :) - person Vlad from Moscow; 26.12.2013
comment
Я пробовал Strncpy (с Барселоной - 9 символов) также организовать char[], но это не помогло. Мне просто нужно знать, как сравнить эти символы [] - person Pivoman; 26.12.2013
comment
@Pivoman Включите простой тестовый код. char *p = db-›Link-›город, *q = город; в то время как (*p && *q) printf(%u %u\n, (int)*p++, (int)*q++); if ( *p != *q ) puts( Строки имеют разную длину! ); - person Vlad from Moscow; 26.12.2013