2013-05-30 4 views
0

У меня есть массив, который имеет тип ** char, который содержит различные значения. Мне нужно проверить, является ли строка пустой или NULL, но независимо от того, что я пытаюсь сделать, это не так.Проверка пустой строки в массиве

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

if (!strcmp(reportParameterArray[P_CALLINGPARTY], "")) 
    { 
     printf("****PERFORMING REPORT WITH RESTRICTIONS*****\n"); 
     exit (0); 
    } 

P_CALLINGPARTY это значение ENUM, которое используется, чтобы определить, из каких индекса в массиве значение должно быть извлечения. Я попытался использовать приведенный выше код, а также reportParameterArray[P_CALLINGPARTY] == NULL, reportParameterArray[P_CALLINGPARTY] == "" и reportParameterArray[P_CALLINGPARTY] = "\0", ни один из которых не работает. Он всегда входит в оператор if.

Когда я отлаживаю код и печатаю значение в gdb, я получаю следующий вывод.

print reportParameterArray[10] 
$5 = 0x8062550 "" 

Спасибо за любую помощь, которую вы можете предоставить.

+1

Вы попробовали 'print reportParameterArray [P_CALLINGPARTY]' в gdb? –

+0

@DarenThomas Это был последний раздел вопроса с выходом – Boardy

ответ

2

Проверьте, если первый символ является строка терминатор:

if (reportParameterArray[P_CALLINGPARTY][0] == '\0') 
{ 
    /* ... */ 
} 

Вы не можете использовать оператор == равенства для сравнения строк, как это будет сравнить только указатель, а не строку, и сравнение с литеральным указателем строки всегда будет ложным.

+0

Спасибо, что это сработало, я приму ответ, но SO заставляет меня ждать 11 минут – Boardy

+0

Это будет неудачно, если один из указателей в массиве будет NULL. –

+0

@LeeDanielCrocker Конечно, это настолько очевидно, что я даже не думал об этом. Кроме того, я _assume_ (да, плохой и все такое), что OP уже проверил, что, в противном случае код OPs уже сработал бы ужасно. –

0

Ваша логика совершенно прекрасна, это просто сравнение строк, которое неверно.

Строки в C - это массивы символов или в вашем случае, char* s, которые являются указателями на первый элемент в строке. Это может работать так, потому что стандартный массив может распадаться на указатель на первый элемент в этом массиве.

Во всяком случае, предположим, что у меня есть две строки, «Foo» и «бар», и хранится в полукокса * нравится следующим образом:

char* str1 = "foo"; 
char* str2 = "bar"; 

str1 и str2 будут указатели на первый символ в каждой строке, который является адресом . str1 может указывать на 0x10 и str2 на 0x20, например.

Теперь давайте присвоим «foo» str2, используя str2 = "foo";. Это фактически изменит адрес памяти str2 пунктов, поскольку это новая строка, поэтому предположим, что это 0x30.

Теперь, учитывая str1 == 0x10 и str2 == 0x30, и есть строка «foo», расположенная на каждом, что произойдет, если мы запустим str1 == str2? Несмотря на то, что они содержат одну и ту же строку, проверка равенства не работает, поскольку они находятся на разных адресах, и мы сравниваем указатели.

Вместо этого есть функция strcmp, которая делает сравнение, и возвращает 0, если они совпадают, поэтому strcmp(str1, str2) == 0.

tl; drstrcmp вместо этого.

2

Если у вас есть массив строк (т., указатели на символы), и вы хотите проверить, что один из его членов «пуст», вам действительно нужно проверить оба условия: либо элемент массива равен NULL, либо он не равен null, а 0. Самый безопасный способ сделать это:

char *array[]; 
. . . 
if (NULL == array[i] || '\0' == *array[i]) { 
    <it's empty> 
} 
Смежные вопросы