0

我有一个 **char 类型的数组,其中包含各种值。我需要检查字符串是空的还是 NULL 但无论我尝试什么都不会。

下面是我目前正在使用的代码。

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

P_CALLINGPARTY 是一个 ENUM 值,用于确定应该从数组中的哪个索引检索该值。我已经尝试使用上面的代码以及reportParameterArray[P_CALLINGPARTY] == NULLreportParameterArray[P_CALLINGPARTY] == ""reportParameterArray[P_CALLINGPARTY] = "\0"两者都不起作用。它总是进入 if 语句。

当我调试代码并在 gdb 中打印值时,我得到以下输出。

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

感谢您的任何帮助,您可以提供。

4

3 回答 3

2

如果您有一个字符串数组(即字符指针),并且您想测试其中一个成员是否为“空”,那么您确实应该检查两个条件:数组元素是否为 NULL,或者它不为空,但长度为 0。最安全的方法是:

char *array[];
. . .
if (NULL == array[i] || '\0' == *array[i]) {
    <it's empty>
}
于 2013-05-30T12:25:12.653 回答
2

检查第一个字符是否为字符串终止符:

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

您不能使用相等运算符==来比较字符串,因为它只会比较指针而不是字符串,并且与文字字符串指针的比较总是错误的。

于 2013-05-30T12:19:18.933 回答
0

你的逻辑很好,只是实际的字符串比较是错误的。

C 中的字符串是字符数组,或者在您的情况下是char*s,它是指向字符串中第一个元素的指针。这可以这样工作,因为标准数组可以衰减为指向该数组中第一个元素的指针。

无论如何,假设我有两个字符串“foo”和“bar”,它们都存储在 char* 中,如下所示:

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

str1并将str2指向每个字符串中的第一个字符,即内存地址str1例如,可能指向 0x10 和str20x20。

现在让我们将“foo”分配给str2using str2 = "foo";。这实际上会改变内存地址str2指向,因为它是一个新字符串,所以我们现在假设它是 0x30。

现在,给定str1 == 0x10and str2 == 0x30,并且每个都有一个字符串“foo”,如果我们运行会发生什么str1 == str2?尽管它们包含相同的字符串,但它们的相等性检查不起作用,因为它们位于不同的地址,我们正在比较指针。

相反,有一个函数strcmp进行比较,如果匹配则返回 0,所以strcmp(str1, str2) == 0.

tl;博士改用strcmp

于 2013-05-30T12:22:53.747 回答