【问题标题】:Iterate Over Char Array Elements in C在 C 中迭代 Char 数组元素
【发布时间】:2020-01-02 19:59:04
【问题描述】:

此代码应该接受用户的输入并将其转换为二进制。输入被分组到一个整数数组中以存储字符代码和/或相邻的数字,然后整数数组中的每个项目都被转换为二进制。当用户键入“c357”时,“c”应转换为99,然后转换为二进制。然后,“357”也应该转换为二进制。在main() 函数中,strlen(convert) 并不能准确地表示数组convert 中的项目数,因此只能迭代第一个数组项目。

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

#define EIGHT_BITS 255
#define SIXTEEN_BITS 65535
#define THIRTY_TWO_BITS 4294967295UL

//  DETERMINE NUMBER OF BITS TO OUTPUT
int getBitLength(unsigned long d) {
    int l;

    if (d <= EIGHT_BITS) {
        l = 8;
    }
    else if (d > EIGHT_BITS && d <= SIXTEEN_BITS) {
        l = 16;
    }
    else if (d > SIXTEEN_BITS && d <= THIRTY_TWO_BITS) {
        l = 32;
    }

    return l;
}

//  CONVERT INPUT TO BINARY VALUE
char* convertToBinary(unsigned long int decimal) {
    int l = getBitLength(decimal);
    static char b[33];
    char bin[33];
    int i, j, k = 0, r;

    b[33] = '\0';
    bin[33] = '\0';

    printf("Bits................ %ld\n", l);

    //  creates array
    for (i = 0; i < l; i++) {
        r = decimal % 2;
        decimal /= 2;
        b[i] = r;
    }

    //  reverses array for binary value
    for (j = l - 1; j >= 0; j--) {
        bin[k] = b[j];
        strncpy(&bin[k], &b[j], l);
        snprintf(&bin[k], l, "%d", b[j]);
        k++;
    }

    printf("Binary Value: %s\n", bin);

    return bin;
}

unsigned long int* numbersToConvert(char* input) {
    const int MAX_INPUT = 20;
    int i, k = 0, z = 0;
    char numbers[MAX_INPUT];
    unsigned long int *toConvert = malloc(MAX_INPUT * sizeof(int));

    numbers[MAX_INPUT] = '\0';

    for (i = 0; i < strlen(input); i++) {

        if (isdigit(input[i])) {
            numbers[z] = input[i];
            if (!isdigit(input[i + 1])) {
                toConvert[k] = strtol(numbers, NULL, 10);
                printf("----- %ld -----\n", toConvert[k]);
                z = 0;
            }
            else {
                z++;
            }
        }
        else {
            printf("----- %c -----\n", input[i]);
            printf("Character Code: %d\n", input[i]);

            toConvert[k] = (unsigned long int) input[i];
        }
        k++;
    }

    return toConvert;
}

int main(void) {
    const int MAX_INPUT = 20;
    int i, p;
    char input[MAX_INPUT];
    unsigned long int* convert;
    printf("------- Input --------\n");
    scanf("%s", input);

    input[MAX_INPUT] = '\0';
    //  PRINT INPUT AND SIZE
    printf("\nInput: %s\n", input);

    convert = numbersToConvert(input);
    convert[MAX_INPUT] = '\0';
    printf("strlen: %ld\n", strlen(convert));

    for (i = 0; i < strlen(convert); i++) {
        printf("num array: %ld\n", convert[i]);
        convertToBinary(convert[i]);
    }

    return 0;
}

我试图空终止每个字符串以防止未定义的行为。我不确定某些变量(如果有的话)是否是静态的。

【问题讨论】:

  • bin[33] 的访问超出其大小。访问权限应为 0 到 32。即使对 input[MAX_INPUT]; 进行了越界访问
  • 在 C 中,数组是从零开始的char array[n] 的有效索引是 0 &lt; n。您的问题不清楚,应该将"c357" 转换为9935799357 作为单独的值吗?
  • @DavidC.Rankin 它们将被转换为单独的值。为什么向我解释数组从 0 开始很重要?我确定我犯了错误,但代码中的一个示例可能会使该信息更加相关。
  • 解释数组从零开始很重要,所以你不要这样做:const int MAX_INPUT = 20;,然后是char numbers[MAX_INPUT];,然后调用 Undefined Behavior,然后执行 numbers[MAX_INPUT] = '\0'; 哪个尝试将地址的值设置为 一个过去 您的 可变长度数组 numbers.

标签: c binary


【解决方案1】:

很难阅读您的代码。

这里你有一些工作(将数字转换为二进制):

static char *reverse(char *str)
{
    char *end = str + strlen(str) - 1;
    char *saved = str;
    int ch;

    while(end > str)
    {
        ch = *end;
        *end-- = *str;
        *str++ = ch;
    }
    return saved;
}

char *tostr(char *buff, unsigned long long val)
{
    if(buff)
    {
        char *cpos = buff;

        while(val)
        {
            *cpos++ = (val & 1) + '0';
            val >>= 1;
        }
        *cpos = 0;
        reverse(buff);
    }
    return buff;
}


int main()
{
    char buff[128];
    printf("%s\n", tostr(buff, 128));
}

https://godbolt.org/z/6sRC4C

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-17
    • 2020-06-09
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多