【问题标题】:How to convert int array to char array如何将int数组转换为char数组
【发布时间】:2021-06-13 09:28:55
【问题描述】:

所以我正在尝试将整数数组转换为特定样式的字符数组。我想结束的是:

charArray[] = "084 438 038 002 093 249 168"

这是我在意识到每个 int 将超过 1 个字符之前开始的。

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

void intToChar(int n, int numArray[], char charArray[]);

int main() {
    
    int i;
    int n = 7;
    int numArray[] = {84, 438, 38, 2, 93, 249, 168};
    char *charArray = (char*)malloc(sizeof(char) * (4 * n - 1);
    intToChar(n, numArray, charArray);
    for (i = 0; i < n; i++) {
     printf("%c ", charArray[i]);
    }
    printf("\n");
    return 0;
}

void intToChar(int n, int numArray[], char charArray[]) {
    
    int i;
    for (i = 0; i < n; i++) {
     charArray[i] = numArray[i] + '0';
    }
}

有没有办法将像 123 这样的 int 准确地转换为“123”?

【问题讨论】:

    标签: arrays c


    【解决方案1】:
    char *intToChar(size_t n, const int *numArray, size_t m, char *charArray) 
    {    
        int pos = 0;
        while(n--)
            pos += snprintf(charArray + pos, m - pos, "%03d%s", *numArray++, n ? " " : "");
        return charArray;
    }
    
    int main() {
        
        int i;
        int n = 7;
        int numArray[] = {84, 438, 38, 2, 93, 249, 168};
        char *charArray = (char*)malloc(4 * n - 1);
        printf("`%s`\n", intToChar(n, numArray, n * 4, charArray));
        free(charArray);
        return 0;
    }
    

    这里有一个更复杂的版本,它将计算它需要多少空间并相应地分配内存。

    char *intToChar(size_t n, const int *numArray) 
    {    
        int pos = 0;
        char *charArray;
    
        //dry run
        for(size_t m = 0; m < n; m++)
            pos += snprintf(NULL, 0, "%03d%s", numArray[m], m == n -1 ? " " : "");
        
        charArray = malloc(pos + 1);    
        pos = 0;
        if(charArray)
            while(n--)
                pos += sprintf(charArray + pos, "%03d%s", *numArray++, n ? " " : "");
        return charArray;
    }
    
    int main() {
        
        int i;
        int numArray[] = {84, 438, 38, 245654, 93, 249, 168};
        size_t n = sizeof(numArray) / sizeof(numArray[0]);
        char *charArray;
        //you should check if the function returned valid pointer before using it
        printf("`%s`\n", (charArray = intToChar(n, numArray)));
        free(charArray);
        return 0;
    }
    

    【讨论】:

    • @G.Sliepen 确实我没有破解这个分配,只是删除了网络需要的 sizeof(char),根据定义,它总是 1
    • 其实这有点不安全;如果numArray[] 包含大于999 的值,sprintf() 将打印整数,它不会截断它,因此它可能会溢出分配的缓冲区。最好使用snprintf() 来确定。
    • 谢谢@0__________!刚刚了解了 snprintf
    • @G.Sliepen 是的,它仍然不安全,因为如果数字太大,它不会生成整个字符串。这里还有更复杂的版本
    【解决方案2】:

    sprintfstrcat 可能很有用。

    类似:

    int main() {        
        int n = 7;
        int numArray[] = {84, 438, 38, 2, 93, 249, 168};
        char charArray[256];
        char tmp[32];
        sprintf(charArray, "%03d", numArray[0]); // Put first number in the
                                                 // result string
        for (int i = 1; i < n; i++) {
         sprintf(tmp, " %03d", numArray[i]);  // Create a string with current number
                                              // Note: the 03 after % which
                                              // puts zero in front of numbers
                                              // having less than 3 digits
    
         strcat(charArray, tmp);              // Append the temporare string
                                              // to the result
        }
    
        printf("%s\n", charArray);    // Print the result
        return 0;
    }
    

    输出:

    084 438 038 002 093 249 168 
    

    【讨论】:

    • 为什么在charArray 中的字符串末尾使用strcat() 而不是只使用sprintf()ing?
    • 你将以"084 438 038 002 093 249 168 "而不是"084 438 038 002 093 249 168"godbolt.org/z/a7eWGxrMf结尾
    • @G.Sliepen 因为这太过分了。
    • 为什么是 tmp[32]?什么系统有这么长的int
    • @0___________ 字符串是 8、16 还是 32 完全无关
    猜你喜欢
    • 2020-11-12
    • 2011-11-09
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    相关资源
    最近更新 更多