我试图将仅用空格分隔的数字字符串转换为int
数组。
int make_array(char s1[]){
// convert string and puts result into array
char *endp = s1;
int sum,i;
int len=strlen(s1);
int *array=(int*)malloc((len)*sizeof(int));
for(i=0;i<len;i++)
if(s1[i]!=" ")
array[i]=strtol(s1, &endp, 10);
s1=endp;
return array;
该功能不起作用,因为它给了我一个随机数。 有人可以给我一些建议吗?
答案 0 :(得分:1)
这是您的方法的工作版本(仍有一个问题):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int * make_array(char s1[], int * arraylen){
// convert string and puts result into array
char *endp = s1;
int i, j=0;
int len=strlen(s1);
int *array = malloc(len*sizeof(int));
for (i=0;i<len;i++)
if(s1[i]!=' ') {
array[ j++ ]=strtol(s1, &endp, 10);
s1=endp;
}
*arraylen = j;
return array;
}
int main() {
int arraylen = 0, i;
int * array = make_array( "9 8 7 123", & arraylen );
for ( i = 0; i < arraylen; i ++ )
printf( "[%i]: %d\n", i, array[i] );
}
主要变化:
s1
; if
arraylen
- make_array
的来电者如何知道数组的长度?int *
,因为我们正在返回array
。s1[i]
与字符' '
(不是字符串" "
)进行比较。array
中的随机条目(除非先memset( array, 0, len*sizeof(int))
)。输出
[0]: 9
[1]: 8
[2]: 7
[3]: 123
[4]: 0
[5]: 0
[6]: 0
如果您只想要一位数字,那么它应该可以正常工作,但strtol
会读取多个数字(如果可用)。
如果您只想阅读数字,您可以:
array[ j++ ] = s1[i] - '0';
如果数字可以有多个数字,您可以这样做:
for (i=0;i<len;)
if ( s1[i] == ' ')
i++;
else {
array[ j++ ]=strtol(s1, &endp, 10);
i += endp - s1;
s1=endp;
}
获得输出
[0]: 9
[1]: 8
[2]: 7
[3]: 123
答案 1 :(得分:0)
如果你不介意采用其他方法,你可以
strtok()
使用空格作为分隔符来标记每个int
。int
并存储到int
阵列。strtok()
返回NULL。那就是说,无论如何,int *array=(int*)malloc((len)*sizeof(int));
不是计算字符串中整数数的正确方法。
答案 2 :(得分:0)
这就是我建议检索空格分隔整数的方法:
for (int i = 0; i < len && *s1; ++i) {
array[i] = strtol(s1, &s1, 10);
s1 += *s1 ? 1 : 0;
}
请注意:
len-1
元素或到达字符串末尾时,循环终止。s1
初始文本的char *
在每次迭代时递增以跳过空格分隔符(或任何单个字符分隔符)。除非你已经到达字符串的null终止符。char
不是数字,或者数字之间的间距超过2,则此代码将失败。获得array
大小的方式似乎不正确。您最终会分配比您想要的更大的数组。
int len=strlen(s1);
如果您有n
个位数字空格分隔数字,len
将为2*n-1
。您可能需要一个额外的变量来存储您在字符串中实际找到的数字。
我还要提醒你注意代码中这部分缺少括号:
for(i=0;i<len;i++)
if(s1[i]!=" ")
array[i]=strtol(s1, &endp, 10);
s1=endp;
s1
在每次迭代时都不会更新,它实际上不在for循环的主体中。