当输入是用 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;
}
我想创建两个数组,一个是字符数组,第二个是整数数组。当用户提供有关整数元素数量的输入时,两者都是动态创建的。所有整数都由 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;
}