C语言中的编码挑战[重复]
Posted
技术标签:
【中文标题】C语言中的编码挑战[重复]【英文标题】:Coding challenge in the C language [duplicate] 【发布时间】:2018-06-21 12:46:14 【问题描述】:我正在尝试在 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 函数。我没有正确实施它。我也不明白它在 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]);
//
当我摆脱 int_rpr[i] = (int)str[i]; 并用任何随机语句替换它时 int b; b = 0; ,它可以工作。
编码挑战链接:https://coderbyte.com/editor/Alphabet%20Soup:C
【问题讨论】:
gets
返回什么与 AlphabetSoup
将什么作为参数?你考虑过调试器吗?您可能还会阅读:***.com/questions/1694036/…
即使你决定使用不安全的gets(),它也需要一个char数组作为它的唯一参数,而不是像'stdin'这样的文件/流描述符。
我认为找到另一个挑战网站会更好:这些人甚至无法为他们的初始样板生成有效的 C 代码。您应该如何根据他们的判断知道您的代码是否正确?
了解Why the gets()
function is too dangerous to be used — ever!
将变量命名为与函数名称相同是一种糟糕的编程习惯。 (关于str_size
和str_size()
)除非有禁止,否则强烈建议包含头文件:string.h
然后调用函数:strlen()
从而消除函数:str_size()
【参考方案1】:
系统要求您解析一个参数(不是来自stdin
的字符串),因此您需要使用argc
和argv
。 sizeof(char)
也是 C 标准的 1,所以是多余的。
也不要重复 strlen
,我们有库是有原因的。
我会这样做(我确认在我的系统上有效)
#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;
【讨论】:
好的,在这个挑战的环境中(而不是命令行),似乎确实从标准输入读取。以上是关于C语言中的编码挑战[重复]的主要内容,如果未能解决你的问题,请参考以下文章