当输入是用 space 分隔的整数时,如何将动态创建的字符数组转换为整数数组

how to convert dynamically created character array into integer array when the input is integers delimited with space

我想创建两个数组,一个是字符数组,第二个是整数数组。当用户提供有关整数元素数量的输入时,两者都是动态创建的。所有整数都由 space 分隔。

输入:

第一行由N组成,这里N是整数个数。假设用户输入 5,下一行将包含 N 个由 space 分隔的整数。即 5 个整数 5 10 23 456 2

输出:

输出将显示整数数组中的元素,即 int_array[i], int_array[i+1]...5,10 ...

但是当我尝试使用我的代码时,我只能从整数数组中看到 0。

代码如下:

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

int *cstois(char *char_array, int *int_array, int n) {
    int i, j;
    for (i = 0, j = 0; i < n; i++) {
        if (char_array[i] >= '0' && char_array[i] <= '9') {
            int_array[j] == int_array[j] * 10 + (char_array[i] - '0');
        } else
        if (char_array[i] == ' ') {
            j++;
        } else
           continue;
    }
    return int_array;
}

int main() {
    int i, n;
    printf("enter no. of elements");
    scanf("%d\n", &n);
    char *char_array;
    char_array = (char*)malloc(n * sizeof(int));
    fgets(char_array, sizeof(char_array), stdin);
    int *int_array = (int*)calloc(n, sizeof(int));
    cstois(&char_array[0], &int_array[0], n);
    for (i = 0; i < n; i++)
        printf("%d\n", int_array[i]);
    free(char_array);
    free(int_array);
    return 0;
}

您的代码中存在多个问题:

  • 没有标准header<malloc.h>malloc() 定义在 <stdlib.h>.

  • 在函数cstois()中,由于打字错误,您没有正确更新数字:int_array[j] == int_array[j] * 10 + (char_array[i] - '0');应该是int_array[j] = int_array[j] * 10 + (char_array[i] - '0');

  • 您忽略所有非数字字符和 space 字符。这不一定正确:1,2,3 将被解析为 123 而不是被报告为错误。

  • 更糟糕的是,您在扫描输入缓冲区时不检查 '[=19=]'。如果从用户读取的行中没有足够的数字,您将扫描到字符串末尾之外并可能超出数组末尾,从而调用未定义的行为。

  • 您跳到 space 字符处的下一个元素。用多个 space 分隔数字会导致数字被错误地跳过。

  • 你不能处理负数。

  • 在函数main()中,输入数组被分配为char_array = (char*)malloc(n * sizeof(int));。这是不正确的,因为它将 32 位整数的平均位数限制为 3...您应该为每个数字分配至少 20 位数字以允许大整数。

  • 从用户那里读取的 fgets() 的行非常短:sizeof(char_array) 是指针的大小,而不是分配给数组的大小。将该大小保存到变量并将其传递给 malloc()fgets().

  • 您不检查 scanf() 的 return 值,也不检查 fgets()malloc() 的值。空文件将无法正确处理。

处理多个 space 分隔符和负数的简单方法是使用 strtol():

int *cstois(char *char_array, int *int_array, int n) {
    for (int i = 0; i < n; i++) {
        int_array[i] = strtol(char_array, &char_array, 10);
    }
    return int_array;
}

这个简单的实现将在第一个 non-number 处停止,并用 0 填充 int_array 中的所有剩余条目。缺少数字同样会在数组中产生零值。

我在接受输入后打印了字符串,我看到有值直到没有 space 出现。我应该用 fgets 做任何修改吗?这是修改后的代码。

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

int *cstois(char *char_array, int *int_array, int n) {
    int i, j;
    for (i = 0, j = 0; i < n; i++) {
        if (char_array[i] >= '0' && char_array[i] <= '9') {
            int_array[j] = (int_array[j] * 10) + (char_array[i] - '0');
        } else
        if (char_array[i] == ' ') {
            if (i == 0)
                continue;
            else
                j++;
        } else {
            continue;
        }
    }
    return int_array;
}

int main() {
    int i, n, length_of_char;
    printf("enter no. of elements");
    scanf("%d\n", &n);
    char *char_array;
    char_array = (char*)malloc(n * 5);
    fgets(char_array, sizeof(char_array), stdin);
    printf("%s\n", char_array);
    length_of_char = strlen(char_array);
    printf("%d\n", length_of_char);
    int *int_array = (int*)calloc(n, sizeof(int));
    cstois(&char_array[0], &int_array[0], length_of_char);
    for (i = 0; i < n; i++)
        printf("%d\n", int_array[i]);
    free(char_array);
    free(int_array);
    return 0;
}