C语言中的编码挑战
我正在尝试用C进行以下编码挑战: 挑战: 使用C语言,让函数AlphabetSoup(str)获取要传递的str字符串参数,并返回按字母顺序排列的字符串(即hello变为ehllo)。假设字符串中不包含数字和标点符号 尝试: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
#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;
}