c - 从 C 中的函数返回 C 字符串

标签 c arrays cstring

我用 c 语言编写了一个函数,用于将以 10 为基数的数字转换为 16 位的二进制表示形式。此函数的输出中也应出现一个空格,例如:00000000 00000001 = 1。转换本身工作正常,但我无法将此值作为字符串返回到 main。我没有收到任何错误,但是在打印 sequence_number(一次一个字符)时,我得到了 ASCII 符号。我意识到这是一个常见问题,但我已经阅读了许多类似的帖子并且无法确定我做错了什么。

void convertToBinary(char *ReturnV, int _this){
    //Declare Variables
    int bin_no[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, bin_Index;
    int working = _this;
    int i, c, singleDigit, a;
    char working_Return[19];
    char binaryDigit[1];

    for(bin_Index = 15; bin_Index > 0; bin_Index--) {//Conversion
        working = (working/2);
        bin_no[bin_Index] = working%2;
    }

    for(i = 0; i < 17; i++) {//Convert to string
        singleDigit = bin_no[i];
        sprintf(binaryDigit, "%d", singleDigit);
        working_Return[i] = binaryDigit[0];
    }

    for(a = 17; a > 9; a--) {//Insert space
        //Copy all values over
        working_Return[a+1] = working_Return[a];
    }

    working_Return[9] = ' ';//Insert Space
    strcpy(ReturnV, working_Return);    
}    

我的函数调用使用

int sequenceNumber_Lower = 48;
char sequence_number[19];
convertToBinary(sequence_number, sequenceNumber_Lower);

但是当我尝试使用

打印 sequence_number(来自 main)的值时
for(c=0 ; c<18 ; c++) { 
    printf("%c", sequence_number[c]);
} 

我得到随机的 ascii 符号。我已验证 working_Return 字符串包含正确的值,因此错误一定在于复制函数末尾的值。还是我做错了,我正在尝试打印已删除的内容?

我知道当函数结束时,局部变量会被销毁,但我觉得我已经这样做了正确,因为我看过这里和其他网站上的许多帖子,这些帖子说这是从函数返回字符串的有效方法之一。你能帮我看看我做错了什么吗?

我已经尝试使用函数声明(并根据定义)返回指向该字符串的指针

char * convertToBinary(int _this);

但这有相同的结果。

最佳答案

这是经过几次修复后的代码(如下所述):

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

void convertToBinary(char *ReturnV, int _this){
    int bin_no[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, bin_Index;
    int working = _this;
    int i, singleDigit, a;
    char binaryDigit[1];

    for(bin_Index = 15; bin_Index >= 0; bin_Index--) {
        working = (working/2);
        bin_no[bin_Index] = working%2;
    }

    for(i = 0;  i < 18; i++) {
        if(i<=7)
            ReturnV[i] = (char)(((int)'0')+bin_no[i]);
        else if(i==8)
            ReturnV[8] = ' ';
        else
            ReturnV[i] = (char)(((int)'0')+bin_no[i+1]);
    }
    ReturnV[17] = '\0';
}    

int main()  {
    int sequenceNumber_Lower = 48;
    char sequence_number[18];
    convertToBinary(sequence_number, sequenceNumber_Lower);
    printf("%s\n", sequence_number);
}

修复:

  1. 不使用 sprintf(),而是使用 (char)(((int)'0')+bin_no[i]) 来转换 intchar
  2. 直接保存到ReturnV 字符串,从而避免创建另一个字符串的需要。
  3. 仅在需要时分配数组。
  4. 在最后添加\0

关于c - 从 C 中的函数返回 C 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26962887/

相关文章:

python - 是否有任何可用的python 寻路库?

c - 如何为外部目录创建 makefile

javascript - Angular/ meteor : Array is undefined

javascript - 使用部分副本断言 Set 包含对象 - Jest

c++ - 使用_variant_t.bstrVal将_variant_t转换为CString或显示在("%s"时会出现差异

c - 在 C 中,一次保存一个字符

c - 使用 malloc 在 C 中正确使用/创建动态 cstrings?

linux c中的条件变量解锁

c - 像 "typedef int arrChoice[5];"这样的东西是全局变量吗?

我可以仅使用一次取消引用来获取二维数组中的值吗?