Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的编码挑战_C - Fatal编程技术网

C语言中的编码挑战

C语言中的编码挑战,c,C,我正在尝试用C进行以下编码挑战: 挑战: 使用C语言,让函数AlphabetSoup(str)获取要传递的str字符串参数,并返回按字母顺序排列的字符串(即hello变为ehllo)。假设字符串中不包含数字和标点符号 尝试: #include <stdio.h> #include <stdlib.h> int cmpfunc(const void* val_1, const void* val_2){ return (*(char *)val_1 - *(ch

我正在尝试用C进行以下编码挑战:

挑战: 使用C语言,让函数AlphabetSoup(str)获取要传递的str字符串参数,并返回按字母顺序排列的字符串(即hello变为ehllo)。假设字符串中不包含数字和标点符号

尝试:

#include <stdio.h> 
#include <stdlib.h>

int cmpfunc(const void* val_1, const void* val_2){
    return (*(char *)val_1 - *(char *)val_2);
}

int str_size(char* str[]){
    int size = 0;
    while(str[size] != '\0')
         size++;
    return size;
}

void AlphabetSoup(char * str[]) { 
  qsort(str,str_size(str), sizeof(char), cmpfunc);
  printf("%s", str); 

}

int main(void) { 

  // disable stdout buffering
  setvbuf(stdout, NULL, _IONBF, 0);

  // keep this function call here
  AlphabetSoup(gets(stdin));
  return 0;

} 
#包括
#包括
内部cmpfunc(常数无效*值1,常数无效*值2){
返回(*(char*)val_1-*(char*)val_2);
}
int str_大小(char*str[]){
int size=0;
而(str[size]!='\0')
大小++;
返回大小;
}
无效字母组(char*str[]){
qsort(str,str_size(str),sizeof(char),cmpfunc);
printf(“%s”,str);
}
int main(void){
//禁用标准输出缓冲
setvbuf(标准输出,空,0);
//将此函数调用保留在此处
字母组(gets(stdin));
返回0;
} 
我没有得到这个代码的任何输出。我认为问题在于cmpfunc功能。我没有正确地执行它。我都不明白qsort内部是如何工作的。我的理解是,val_1和val_2是指向数组中两个内存块的指针,我必须以某种方式将这些内存块转换为正确的类型

我还获得以下代码的非零状态:

void AlphabetSoup(char * str[]) {
  int str_size_ = str_size(str);
  int int_rpr[str_size_];
  int i;
  for(i = 0; i < str_size; i++){
      int_rpr[i] = (int)str[i];
  }
  printf("%i", str_size_);
    //printf("%s", str);
  //qsort(int_rpr,str_size_, sizeof(int), cmpfunc);

  //for(i = 0; i < str_size; i++){
   // printf("%c", str[i]); 
 // }

}
void字母组(char*str[]{
int str_size=str_size(str);
内部rpr[str_size_uu];
int i;
对于(i=0;i
当我去掉int_rpr[I]=(int)str[I];并将其替换为任何随机语句,如int b;b=0,它起作用了


编码挑战链接:

要求您解析一个参数(不是
stdin
中的字符串),因此您需要使用
argc
argv
。根据C标准,
sizeof(char)
也是1,因此是多余的。 也不要复制strlen,我们有库是有原因的

我会这样做(我确认这在我的系统上有效)

#包括
#包括
#包括
int char_cmp(常数无效*pa,常数无效*pb){
字符a=*((字符*)pa),b=*((字符*)pb);
如果(ab){
返回1;
}否则{
返回0;
}   
}
int main(int argc,char*argv[]){
char*input=NULL;
如果(2!=argc){
fprintf(stdout,“给出一个参数字符串\n”);
返回1;
}否则{
输入=strdup(argv[1]);
如果(NULL==输入){
fprintf(stderr,“内存错误”);
返回2;
}       
}   
qsort(输入,strlen(输入),1,char_-cmp);
fprintf(标准输出,“%s\n”,输入);
免费(输入);
返回0;
}

AlphabetSoup
作为参数使用的内容相比,
获取的
返回的内容是什么?你考虑过调试器吗?您可能还会读到:即使您决定使用不安全的gets(),它也会将char数组作为其唯一参数,而不是像“stdin”这样的文件/流描述符。我认为最好找到另一个挑战网站:这些人甚至无法为其初始样板生成有效的C代码。根据他们的判断,你应该如何知道你的代码是否正确?请阅读以下文章:将变量命名为函数名是一种糟糕的编程实践。(关于
str_size
str_size()
)除非有一些禁止,否则强烈建议包含头文件:
string.h
,然后调用函数:
strlen()
,从而消除函数:
str_size()
OK,在这个挑战的环境中(与命令行相反)人们似乎确实从stdin读取数据。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int char_cmp(const void *pa, const void *pb){

    char a = *((char *) pa), b= *((char *) pb);
    if (a < b){ 
        return -1;
    } else if (a > b){ 
        return 1;
    } else {
       return 0;
    }   
}

int main(int argc, char *argv[]){

char *input= NULL;
if (2 != argc){
    fprintf(stdout, "give one argument string\n");
    return 1;
} else {
    input = strdup(argv[1]);
    if (NULL == input){ 
        fprintf(stderr, "memory error\n");
        return 2;   
    }       
}   
qsort(input, strlen(input), 1, char_cmp);
fprintf(stdout, "%s\n", input);
free(input);
return 0;

}