我有一个类型为** 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 ""
感谢您提供的任何帮助。
答案 0 :(得分:2)
检查第一个字符是否为字符串终结符:
if (reportParameterArray[P_CALLINGPARTY][0] == '\0')
{
/* ... */
}
您不能使用等于运算符==
来比较字符串,因为它只会比较指针而不是字符串,并且与文字字符串指针的比较将始终为false
答案 1 :(得分:2)
如果你有一个字符串数组(即字符指针),并且你想测试它的一个成员是"空",你真的应该检查两个条件:要么数组元素为NULL,或者它不是null但是长度为0。最安全的方法是:
char *array[];
. . .
if (NULL == array[i] || '\0' == *array[i]) {
<it's empty>
}
答案 2 :(得分:0)
你的逻辑非常好,只是实际的字符串比较是错误的。
C中的字符串是字符数组,或者在您的情况下是char*
s,它们是指向字符串中第一个元素的指针。这可以这样工作,因为标准数组可以衰减到指向该数组中第一个元素的指针。
无论如何,假设我有两个字符串,“foo”和“bar”,都存储在char *中,如下所示:
char* str1 = "foo";
char* str2 = "bar";
str1
和str2
将指向每个字符串中的第一个字符,即内存地址。例如,str1
可能指向0x10,str2
指向0x20。
现在让我们使用str2
将“foo”指定给str2 = "foo";
。这实际上会改变内存地址str2
,因为它是一个新字符串,所以我们假设现在这是0x30。
现在,鉴于str1 == 0x10
和str2 == 0x30
,并且每个都有一个字符串“foo”,如果我们运行str1 == str2
会发生什么?尽管它们包含相同的字符串,但它们的相等性检查不起作用,因为它们位于不同的地址,我们正在比较指针。
相反,有一个函数strcmp
用于比较,如果匹配则返回0,所以strcmp(str1, str2) == 0
。
tl; dr 改为使用strcmp
。