无法将参数1从char转换为strcmp的const char

时间:2014-08-21 01:23:46

标签: c

我刚开始在c中使用指针。我想通过在命令提示符下输入字符串来对字符串进行排序。

当我尝试实现它时,我收到此错误:

'strcmp' : cannot convert parameter 1 from 'char' to 'const char *'

你能指导我并告诉我如何用更少的指针和更多的数组来制作代码吗?

char *sort(char *sortIt)
{
    char *p =sortIt;
    //p = (char*)calloc(sizeof(char));
    char temp[3];
    int len = strlen(sortIt);
    for(int i=0;i<len;i++)
    {
        for(int j=i+1;j<len;j++)
        {
            if(strcmp(p[i],p[j])>0)
            {
                strcpy(temp,p[i]);
                strcpy(p[i],p[j]);
                strcpy(p[j],temp);
            }
        }
    }

    for(int ij=0;ij<len;ij++)
      printf("%s", p[ij]);
}

int main(char argc, char **argv)
{
    char *p=argv[1];

    sort(p);
}

3 个答案:

答案 0 :(得分:1)

在C中,字符串表示空终止字符串。因此,大多数C库函数都利用了这一点。例如,strcmpstrcpy

因此,在调用strcmp(p[i],p[j])strcpy(temp,p[i])时,您的代码是错误的,因为strcmpstrcpy处理strings而不是chars和{{1}是一个char。

要比较C中的字符,您只需使用p[i]即可。要复制一个字符,您只需if (p[i] > p[j]) ...

答案 1 :(得分:0)

编辑:

更改所有

 p[i], p[j]

 &p[i], &p[j]

因为你想要const char指针。在你原来的情况下,你只会看着字符。

答案 2 :(得分:0)

似乎代码正在尝试对字符串中的char进行排序。代码中注明的更正和想法。

char *sort(char *sortIt)
{
    // After assignment p & sortIt never change. Only need one of these.
    char *p =sortIt;
    // casting the return of callloc() and malloc() is frowned upon.
    // Note: sizeof(char) is _always_ 1
    //p = (char*)calloc(sizeof(char)); 
    char temp[3];  // Only 1 char is needed.  Best to declare in inner lock
    int len = strlen(sortIt);  // Better to use size_t len,i,j,ij;
    for(int i=0;i<len;i++)
    {
        for(int j=i+1;j<len;j++)
        {
            // Only need to compare p[i] > p[j]
            if(strcmp(p[i],p[j])>0)
            {
                // Only need to swap  p[i] p[j]
                strcpy(temp,p[i]);
                strcpy(p[i],p[j]);
                strcpy(p[j],temp);
            }
        }
    }
    // Only need to print the string once
    for(int ij=0;ij<len;ij++)
      printf("%s", p[ij]);
// missing return
}

样本解决方案:

char *sort(char *p) {
  size_t len = strlen(p);
  for (size_t i = 1; i < len; i++) {
    for (size_t j = 0; j < i; j++) {
      /// As this code changed the order of indexing, maybe p[i] < p[j]
      if (p[i] > p[j]) { 
        char temp;
        temp = p[i];
        p[i] = p[j];
        p[j] = temp;
      }
    }
  }
  printf("%s\n", p);  // Recommend adding \n
  return p;
}

[编辑]

我发现原始main()代码存在问题。以下是包含建议更改的代码:

int main(char argc, char **argv)
{
    // Good to test if argv[1] is valid.
    if (argc <= 1) return 1;
    // Although legal for historic reasons, best to 
    // char *p=argv[1];  
    const char *p=argv[1]; 
    // Since sort() is going to re-arrange p, either sort() allocates new memory
    //   or we allocate memory here.  Then const char *p is not needed.
    size_t size = strlen(argv[1]) + 1;
    char *q;
    q = malloc(size);
    memcpy(q, argv[1], size);
    // sort(p);
    sort(q);
    // Good policy to free allocated memory
    free(q);
    return 0;  // Always good to return a value from main()
}