【问题标题】:Coding challenge in the C language [duplicate]C语言中的编码挑战[重复]
【发布时间】: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 代码。您应该如何根据他们的判断知道您的代码是否正确?
  • 将变量命名为与函数名称相同是一种糟糕的编程习惯。 (关于str_sizestr_size())除非有禁止,否则强烈建议包含头文件:string.h然后调用函数:strlen()从而消除函数:str_size()

标签: c


【解决方案1】:

系统要求您解析一个参数(不是来自stdin 的字符串),因此您需要使用argcargvsizeof(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;

}

【讨论】:

  • 好的,在这个挑战的环境中(而不是命令行),似乎确实从标准输入读取。
最近更新 更多