指针有问题,在C中使用strcmp()

时间:2015-04-20 00:49:18

标签: c arrays pointers char strcmp

我正在编写一个将给定数组拆分为2个部分的方法。它将前半部分保留在原始数组中,并使用标记分割位置的符号将另一半放入临时数组中。我得到的错误如下:

Warning: passing argument 2 of ‘strcmp’ makes pointer from integer without a cast
     if(strcmp(input[i], symbol) == 0){
                         ^
In file included from process.c:7:0:
/usr/include/string.h:144:12: note: expected ‘const char *’ but argument is of type ‘char’
 extern int strcmp (const char *__s1, const char *__s2)
            ^
process.c:95:16: warning: assignment makes integer from pointer without a cast
       input[i] = NULL;
                ^
process.c:96:26: warning: comparison between pointer and integer
       while(input[i + 1] != NULL){
                          ^
process.c:98:22: warning: assignment makes integer from pointer without a cast
         input[i + 1] = NULL;
                      ^

这是我的代码:

char *splitCommands(char *input, char symbol){
   int i = 0, j = 0;
   char *temp;
   int symbIndex; // where the symbol was
   while(input[i] != NULL){
    if(strcmp(input[i], symbol) == 0){
      symbIndex = i;
      input[i] = NULL;
      while(input[i + 1] != NULL){
        temp[j] = input[i + 1];
        input[i + 1] = NULL;
        i++;
        j++;
      }
      break;
    }

     i++;
  }

   return temp;

}

3 个答案:

答案 0 :(得分:0)

您可以直接进行此比较

if (input[i] == symbol)

因为input[i]symbol的类型为char,因此您比较它们的值,当您比较地址的字符串时,这就是您需要strcmp()的原因。

input[i + 1] = NULL;

相当于

input[i + 1] = (void *) 0;

因此,你试图将指针分配给char,这也是错误的,也许你的意思是

input[i + 1] = 0;

或以更多c-ish的方式

input[i + 1] = '\0';

此外,while条件,同样的问题,只是

while (input[i])

就足够了,如果你希望你的代码更具可读性,我个人认为,

while (input[i] != '\0')

更具可读性。

你不能使用temp之类的,因为它没有初始化,你需要为它分配空间,就像这样

temp = malloc(1 + estimatedSizeInBytes);
if (temp == NULL)
    return NULL;

/* add the '\0' terminator */
temp[realSize - 1] = '\0';

其中realSize <= estimatedSize

完成使用后,您还应该记住free()此函数返回的指针。

答案 1 :(得分:0)

input[i]symbolchar。所以imput[i] == symbol的营地。并且不要忘记为char *tmp

分配内存

答案 2 :(得分:0)

您的代码存在一些问题,但编译错误的主要问题和原因之一是strcmp()将两个指向c样式字符串的指针作为参数。你传递两个char,而不是指针。

另一个问题是你将char分配给NULL,但是NULL只应该用于指针,而不是像char / int / float这样的其他类型。如果您正在尝试检查c样式字符串的结尾,请检查char是否等于0或'\ 0'。在完成此程序之前,您可能需要花更多时间学习c样式字符串和指针。

我不会为您完成作业/工作,但我会举例说明如何使用strcmp():

#include <string.h>
#include <stdio.h>

int main()
{
    char String1[4] = "abc";
    char String2[4] = "xyz";

    int Result = strcmp(String1, String2);

    if (Result < 0)
        printf("%s < %s\n", String1, String2);
    if (Result == 0)
        printf("%s = %s\n", String1, String2);
    if (Result > 0)
        printf("%s > %s\n", String1, String2);

    return 0;
}

输出:abc&lt; XYZ

这是来自cplusplus.com的额外strcmp() reference