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_sizestr_size())除非有禁止,否则强烈建议包含头文件:string.h然后调用函数:strlen()从而消除函数:str_size() 【参考方案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;


【讨论】:

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

以上是关于C语言中的编码挑战[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C语言,删除数组中的重复数字然后输出

C语言问题 把一个数组中的重复元素去掉

C语言问题 把一个数组中的重复元素去掉

请问如何用C语言实现汉字,和Unicode编码的转换?

c语言中字符型数据在内存中的存储形式是?

在c语言中输入数组两个数组,查找重复元素并输出怎么写啊