О строке, нулевом символе и strcmp

Я создал программу C в микроконтроллере и хочу сравнить строку в моей программе C со строкой, полученной от моего ПК, моей программы на ПК с использованием C#, и по умолчанию строка в C# не содержит нулевой символ.

Итак, моя программа c не добавляет автоматически нулевой символ в строку, полученную с ПК?

И может ли функция strcmp сравнивать 2 строки, 1 строка содержит нулевой символ, а другая не содержит нулевой символ?


person Anti Mafia    schedule 09.03.2015    source источник
comment
strcmp требует, чтобы оба аргумента заканчивались NUL   -  person Spikatrix    schedule 09.03.2015
comment
В C у вас есть нуль, если вы не инициализировали свою строковую переменную   -  person acostela    schedule 09.03.2015
comment
Просто чтобы добавить к комментарию мистера @CoolGuy, в основном все функции в string.h нуждаются в аргументах, завершающихся нулем.   -  person Sourav Ghosh    schedule 09.03.2015
comment
Итак, когда моя программа c получает строку из программы C # для сравнения, мне нужно добавить нулевой символ вручную?   -  person Anti Mafia    schedule 09.03.2015
comment
@ThePara MagneticCroissant Нет? Итак, если вы не инициализировали строку в C, что вы получите? Я имею в виду, если вы только объявите свою переменную и не вызовете конструктор? Будете ли вы получать мусор прямо внутри вашей переменной? Я думал, что это НУЛЬ   -  person acostela    schedule 09.03.2015
comment
Неинициализированные переменные @acostela имеют неопределенное значение. не гарантируется, что он будет 0 или NULL или что-то в этом роде. (также в C нет конструкторов.)   -  person The Paramagnetic Croissant    schedule 09.03.2015


Ответы (1)


Определение строк в C (из Википедии)

Строка представляет собой непрерывную последовательность кодовых единиц, заканчивающуюся первым нулевым кодом (соответствующим нулевому символу ASCII).

Тем не менее, без символа NUL вы не можете использовать стандартные строковые функции, такие как strcmp() или strcpy(), и это может привести к повреждению памяти.

Вы можете сделать две вещи: добавить Char.MinValue в конец строки кода C# перед передачей.

string str = "Hello,World!" + Char.MinValue; // Add NUL.

Или вы можете написать свою собственную функцию сравнения строк, например

int myStrcmp(char* str1, char* str2, int len)
{
    int retVal = 0,

    for(int loopcnt = 0; loopcnt < len; loopcnt++)
     {

          if((*str1) > (*str2))
           {
              retVal = -1;
               break;        
           }
          else if((*str1) < (*str2))
           {
              retVal = 1;
               break;                      
           }
           str1++;
           str2++;

     }
 return retVal;
}

Но тогда вам потребуется длина строки. Если вы уже знаете длину, лучше и быстрее добавить символ NUL вручную. :-)

person Swanand    schedule 09.03.2015
comment
Спасибо, сэр, возможно, я буду использовать строку str = Hello, World! + Символ.Минимальное значение; В вашей функции какое значение должно быть для переменной len? и как, если я хочу добавить нулевой символ из моей программы c? - person Anti Mafia; 09.03.2015
comment
@AntiMafia len - это длина строки (которую вы должны знать... без NUL), и чтобы добавить NUL в вашу строку, вы знаете длину, и вы должны получить строку в массиве, поэтому добавьте 0x00 в качестве следующего элемента в массиве или сбросьте буфер приема со всеми 0x00, прежде чем что-либо получите, и повторите это для каждого приема - person Swanand; 10.03.2015
comment
Я запутался, сэр. Если строка, которую я хочу проверить, \0, и строка, которую я хочу сравнить, проверяется (без нуля, потому что я получаю строку с ПК). Итак, я получу возвращаемое значение 0? - person Anti Mafia; 10.03.2015
comment
Если вы пройдете проверку и проверку строки (независимо от NUL для этой функции) и длину 4 (длина test), вы получите 0, но если вы передадите длину 7 (длина testing ), вы ее не получите. Попробуйте понять этот код. - person Swanand; 12.03.2015