如何返回一个 char 数组并在 main 中打印它?

Posted

技术标签:

【中文标题】如何返回一个 char 数组并在 main 中打印它?【英文标题】:How can I return a char array and print it in main? 【发布时间】:2016-02-24 14:08:08 【问题描述】:

我已经构建了一个函数,它获取一个整数参数并返回一个 char 数组。

例如,对于 13 的参数,函数应返回“0013”;对于 3 的参数,该函数应返回“0003”。

但我没有收到错误,我无法使用 printf(getInstructionIndex(13)); 显示此值

这是我的代码:

/* get Instruction Index how "0001" or "0010" */
char * getInstructionIndex(int index)

    char number1;
    char number2;
    char number3;

    char *str = (char *) malloc(sizeof(char) * 4);

        if(index < 10)

            number1 = '0';
            number2 = '0';
            number3 = '0';

            str[0] = number1;
            str[1] = number2;
            str[2] = number3;
            str[3] = index;

            return str;
        
        else
            if(index < 100 && index >= 10)

                number1 = '0';
                number2 = '0';

                str[0] = number1;
                str[1] = number2;
                str[2] = index;

                return str;

            
            else
            
                if(index < 1000 && index >= 100)
                    number1 = '0';

                    str[0] = '0';
                    str[1] = index;

                    return str;
                
                else
                
                    str[0] = index;

                    return str;
                
            
        

        free(str);


这是我的主要内容:

int main(int argc, char *argv[])

    printf("started\n");


    printf(getInstructionIndex(13)); /* i must see 0013*/

    printf("stopped\n");

    return 0;

【问题讨论】:

你不只是使用printf("%04d", someInteger); 请注意,强制转换malloc() 的返回值不是好的做法。见***.com/q/605845/3488231 【参考方案1】:

问题

字符串str只分配了4个字符,对于空终止符不够用 未添加空终止符 复杂的逻辑 内存泄漏 缺少格式说明符 强制转换 malloc 返回

调整后的代码

#include <stdio.h>
#include <stdlib.h>

/* get Instruction Index how "0001" or "0010" */
char * getInstructionIndex(int index)
  /* overflow + underflow handling */
  if(index < 0 || index > 9999)return 0;

  /* allocate enough for the null terminator.. */
  char *str = malloc(sizeof(*str) * 5);
  /* error handling */
  if(!str)
  
    return 0;
  

  /* simplify logic, use a nice format specifier */
  sprintf(str, "%04d", index);
  return str;


int main(int argc, char *argv[])

  char *instruction_index;
  printf("started\n");
  instruction_index = getInstructionIndex(13);
  if(!instruction_index)
  
    // error handling here..
    return 0;
  
  /* add format string.. */
  printf("%s\n", instruction_index); /* i must see 0013*/
  /* release the memory */
  free(instruction_index);
  printf("stopped\n");
  return 0;

输出

$ gcc -g test.c -o test
$ valgrind ./test
==2713== Memcheck, a memory error detector
==2713== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==2713== Using Valgrind-3.10.0.SVN and LibVEX; rerun with -h for copyright info
==2713== Command: ./test
==2713== 
started
0013
stopped
==2713== 
==2713== HEAP SUMMARY:
==2713==     in use at exit: 0 bytes in 0 blocks
==2713==   total heap usage: 1 allocs, 1 frees, 5 bytes allocated
==2713== 
==2713== All heap blocks were freed -- no leaks are possible
==2713== 
==2713== For counts of detected and suppressed errors, rerun with: -v
==2713== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

参考

printf valgrind quickstart casting malloc

【讨论】:

更改为使用 sizeof(*str) 以与链接保持一致。并添加安全防护以在输入无效的情况下返回 null(输入不能以 5 个字符打印,包括 null 终止符)【参考方案2】:

这段代码确实存在内存泄漏,free 应该延迟到打印数组之后,例如:

char *str = getInstructionIndex(13)
printf("%s", str); /* i must see 0013*/
free(str);

如果你想打印一个你应该使用的函数返回的字符串:

printf("%s", str);

还有一件事,您在 getInstructionIndex 方法中构造的值需要由字符串终止符 \0 终止(否则您将在输出中得到垃圾)。

【讨论】:

以上是关于如何返回一个 char 数组并在 main 中打印它?的主要内容,如果未能解决你的问题,请参考以下文章

返回一个指向 char 数组的指针。如何打印出数组的全部内容?

如何将转换为 char 数组的 int 返回到 main 以显示它

如何使用指针从2D char数组中生成一个句子

如何使用ifstream将char数组打印到char数组

如何将char数组转换回字符串[重复]

如何使用 ifstream 将 char 数组打印到 char 数组