【发布时间】: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; ,它可以工作。
【问题讨论】:
-
gets返回什么与AlphabetSoup将什么作为参数?你考虑过调试器吗?您可能还会阅读:*.com/questions/1694036/… -
即使你决定使用不安全的gets(),它也需要一个char数组作为它的唯一参数,而不是像'stdin'这样的文件/流描述符。
-
我认为找到另一个挑战网站会更好:这些人甚至无法为他们的初始样板生成有效的 C 代码。您应该如何根据他们的判断知道您的代码是否正确?
-
将变量命名为与函数名称相同是一种糟糕的编程习惯。 (关于
str_size和str_size())除非有禁止,否则强烈建议包含头文件:string.h然后调用函数:strlen()从而消除函数:str_size()
标签: c