1

我相对是 C 编程的初学者,并且对数组和指针感到非常困惑。

基本上我想要做的是将包含二进制的字符串扩展到指定的长度len;(即 len=8 表示num[]=101会产生"00000101")。

有人可以帮我理解这有什么问题吗?

const char * extendBinary(char num[], int len) {
        char *number = #
        int length = len;
        int difference;
        if(strlen(*num)<len) {
            difference = len-strlen(num);
            while(difference>0)
            {
                &number = strcat("0", &number);
                difference--;
            }
        }
        return number;
    }
4

4 回答 4

1

您的问题始于您的规范。如果我理解正确,您希望有一个函数可以传递字符数组和长度。输入字符数组的大小将介于 1 和len? 但是,您的函数无法知道数组的大小num。如果你想让它工作,你需要将你的函数定义为

const char * extendBinary(char *num, size_t num_len, int len);

这样您的函数就不会超出 . 指向的缓冲区num。请注意,我替换为char num[]char *num因为这是传递指针的常用机制。您不能将指针传递给数组,然后取消引用该指针并取回原始类型(包括其大小)——这只是 C 不允许您做的一件事,所以只需使用普通指针和单独的大小变量。

最后,除非您想要内存泄漏,否则您将不得不处理内存分配。因此,您可以简单地说,调用extendBinary 的人应该在使用完它时释放它的返回值。

const char * extendBinary(char *num, size_t num_len, int len) {
    char *ret = malloc(len + 1);
    int i;

    memset(ret, '0', len);
    ret[len] = 0;
    strncpy(&ret[len - num_len], num, num_len);

    return ret;
}

int main(void) {
    char arr[] = {'1', '0', '1'};
    const char *formatted = extendBinary(arr, sizeof(arr), 8);

    printf("%s\n", formatted);
    free(formatted);
    return 0;
}
于 2013-04-25T20:11:00.170 回答
0

这是错误的。

strcat("0", &number);

修复代码的一种奇怪方法是:

char temp[32] = {};

...
    ...
        while(difference>0)
        {
            strncat(temp, "0", 31 - strlen(temp));
            difference--;
        }
        strncat(temp, num, 31 - strlen(temp));
        strncpy(num, temp, len);

请注意,我编写此代码只是为了帮助您了解 strcat() 的工作原理,有更好的方法来做您想做的事情。

您不能将某些内容连接到 const 字符串,您必须完全控制代码中发生的事情以及代码的编写位置。您知道源代码中指向“0”的指针在哪里吗?

于 2013-04-25T17:58:59.033 回答
0

你如何设置num?如果它真的是一个字符数组而不是字符串,则不需要它以空值结尾,除非它是全局/静态的。如果你在一个函数中这样设置它:

char str[10];
str[0] = '1';
str[1] = '0';
str[2] = '1';

比你的 strlen 会得到什么,取决于 num 中发生的任何垃圾。

于 2013-04-25T18:00:16.767 回答
0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//case 1: for num[9]="101";
char *extendBinary1(char num[], int len) {
    int num_len = strlen(num);
    memmove(num + (len - num_len), num, num_len);
    memset(num, '0', (len - num_len));

    return num;
}

//case 2: for "101";//pointer to const char 
char *extendBinary2(const char num[], int len) {
    int num_len = strlen(num);
    char *number = calloc(len + 1, sizeof(char));
    memset(number, '0', (len - num_len));

    return strcat(number, num);
}


int main(void){
    char num[9] = "101";
    char *number = extendBinary2("101", 8);//dynamic allocate

    printf("%s\n", extendBinary1(num, 8));
    printf("%s\n", number);//free(number);

    return 0;
}
于 2013-04-25T21:18:31.510 回答