如何在C中存储和返回字符串

如何在C中存储和返回字符串,c,arrays,binary,return,hex,C,Arrays,Binary,Return,Hex,下面的代码获取一个包含十六进制值的文本文件,并将十六进制值转换为二进制并打印出来。如何修改它,使我的hex_to_二进制函数可以初始化字符串数组,并将转换后的二进制文件添加到数组中,然后返回数组。然后我只想通过在我的主函数中添加printf语句来打印hex_to_二进制函数的输出。提前谢谢 #include <stdio.h> int hex_to_binary(char*); int main(int argc, char *argv[]) { FILE *file;

下面的代码获取一个包含十六进制值的文本文件,并将十六进制值转换为二进制并打印出来。如何修改它,使我的hex_to_二进制函数可以初始化字符串数组,并将转换后的二进制文件添加到数组中,然后返回数组。然后我只想通过在我的主函数中添加printf语句来打印hex_to_二进制函数的输出。提前谢谢

#include <stdio.h>

int hex_to_binary(char*);

int main(int argc, char *argv[])
{
    FILE *file;
    file = fopen(argv[1],"r");
    char line[100];

    while(!feof(file)){
        fgets(line,100,file);
        hex_to_binary(line);
    }
    fclose(file);
    getchar();
    return 0;
}

int hex_to_binary(char* hex_string)
{
    int i=0;
    printf("\nEquivalent binary value: ");
    while(hex_string[i])
    {
         switch(hex_string[i])
         {
             case '0': printf("0000"); break;
             case '1': printf("0001"); break;
             case '2': printf("0010"); break;
             case '3': printf("0011"); break;
             case '4': printf("0100"); break;
             case '5': printf("0101"); break;
             case '6': printf("0110"); break;
             case '7': printf("0111"); break;
             case '8': printf("1000"); break;
             case '9': printf("1001"); break;
             case 'A': printf("1010"); break;
             case 'B': printf("1011"); break;
             case 'C': printf("1100"); break;
             case 'D': printf("1101"); break;
             case 'E': printf("1110"); break;
             case 'F': printf("1111"); break;
             case 'a': printf("1010"); break;
             case 'b': printf("1011"); break;
             case 'c': printf("1100"); break;
             case 'd': printf("1101"); break;
             case 'e': printf("1110"); break;
             case 'f': printf("1111"); break;
        }
        i++;
     }
    return 0;
}

strcat函数是您想要的

如果我是你,为了简单起见,我会在下面做一个:

定义全局字符数组:

char buffer[1000]; // define a space to write our string

....
按如下方式更改十六进制函数:

while(hex_string[i])
        {
             switch(hex_string[i])
             {
                 case '0': strcat(buffer,"0000"); break;
                 case '1': strcat(buffer,"0001"); break;
                 case '2': strcat(buffer,"0010"); break;
                 ....
             }
        }
主要用于打印字符串:

 printf("%s\n",buffer);  

注意:不要忘了在每次十六进制到二进制函数调用后清除缓冲区,否则它会将前面的数字保留在里面。有几种方法可以做到这一点

您不能做的一件事是在函数中声明一个字符数组,使用sprintf打印它,然后返回它。在函数返回后,您无法确定它所指向的空间是否存在

也就是说,不要这样做:

不是

如果要在循环中调用十六进制到二进制,每个十六进制数字调用一次,则可以更改case语句以返回指向字符串的指针,而不是打印:

switch(hex_digit)
{
    case '0' : return "0000";
    case '2' : return "0001"; 

    <etc>
换成这样:

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

char *hexstr_to_binstr(char *outbuff, const char *s);

int main(int argc, char *argv[]){
    FILE *file = fopen(argv[1],"r");
    char line[100];
    char binstr[4*sizeof(line)];

    while(fgets(line, sizeof(line), file)){
        puts(hexstr_to_binstr(binstr, line));
    }
    fclose(file);
    getchar();
    return 0;
}

const char *xdigit_to_binstr(char x){
    switch(x){
        case '0': return("0000");
        case '1': return("0001");
        case '2': return("0010");
        case '3': return("0011");
        case '4': return("0100");
        case '5': return("0101");
        case '6': return("0110");
        case '7': return("0111");
        case '8': return("1000");
        case '9': return("1001");
        case 'a': 
        case 'A': return("1010");
        case 'b': 
        case 'B': return("1011");
        case 'c': 
        case 'C': return("1100");
        case 'd': 
        case 'D': return("1101");
        case 'e': 
        case 'E': return("1110");
        case 'f': 
        case 'F': return("1111");
        default : return "";
    }
    return NULL;//never reach this point
}
char *hexstr_to_binstr(char *outbuff, const char *s){
    char *p = outbuff;

    for(; *s ; ++s){
        if(isxdigit(*s)){
            memcpy(p, xdigit_to_binstr(*s), 4);
            p += 4;
        }
    }
    *p = 0;
    return outbuff;
}

在C编程语言中不能返回数组。如果需要,您可以返回一个指向通过malloc或类似函数获得的内存的指针。我将如何在代码中实现它?很抱歉,我来自Python背景,我遇到了一个错误:当我在main中插入printf语句时,使用了未声明的标识符“buffer”。还有,如何清除缓冲区?
char *binary_line;

while(!feof(file)){
    fgets(line,100,file);
    binary_line = hex_to_binary(line);
    printf("%s", binary_line);
    free(binary_line);
}
while(!feof(file)){
    fgets(line,100,file);
    printf("%s", hex_to_binary(line););
}
switch(hex_digit)
{
    case '0' : return "0000";
    case '2' : return "0001"; 

    <etc>
int hex_to_binary(char *hex_string, char *binary_line)
{
    <etc>

        switch(hex_string[i])
        {
            case '0' : strcat(binary_string, "0000"); break;

    <etc>

    return 0;
}
char binary_line[MAX_SPACE + 1];

while(!feof(file)){
    fgets(line,100,file);
    hex_to_binary(line, binary_line);
    printf("%s", binary_line);
}
#include <stdio.h>
#include <string.h>
#include <ctype.h>

char *hexstr_to_binstr(char *outbuff, const char *s);

int main(int argc, char *argv[]){
    FILE *file = fopen(argv[1],"r");
    char line[100];
    char binstr[4*sizeof(line)];

    while(fgets(line, sizeof(line), file)){
        puts(hexstr_to_binstr(binstr, line));
    }
    fclose(file);
    getchar();
    return 0;
}

const char *xdigit_to_binstr(char x){
    switch(x){
        case '0': return("0000");
        case '1': return("0001");
        case '2': return("0010");
        case '3': return("0011");
        case '4': return("0100");
        case '5': return("0101");
        case '6': return("0110");
        case '7': return("0111");
        case '8': return("1000");
        case '9': return("1001");
        case 'a': 
        case 'A': return("1010");
        case 'b': 
        case 'B': return("1011");
        case 'c': 
        case 'C': return("1100");
        case 'd': 
        case 'D': return("1101");
        case 'e': 
        case 'E': return("1110");
        case 'f': 
        case 'F': return("1111");
        default : return "";
    }
    return NULL;//never reach this point
}
char *hexstr_to_binstr(char *outbuff, const char *s){
    char *p = outbuff;

    for(; *s ; ++s){
        if(isxdigit(*s)){
            memcpy(p, xdigit_to_binstr(*s), 4);
            p += 4;
        }
    }
    *p = 0;
    return outbuff;
}