我刚开始在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);
}
答案 0 :(得分:1)
在C中,字符串表示空终止字符串。因此,大多数C库函数都利用了这一点。例如,strcmp
,strcpy
等
因此,在调用strcmp(p[i],p[j])
和strcpy(temp,p[i])
时,您的代码是错误的,因为strcmp
和strcpy
处理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()
}