如何将字符串转换为int并将结果放入数组

时间:2016-01-31 15:08:07

标签: c arrays string pointers

我试图将仅用空格分隔的数字字符串转换为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;

该功能不起作用,因为它给了我一个随机数。 有人可以给我一些建议吗?

3 个答案:

答案 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)

如果你不介意采用其他方法,你可以

  1. 将传入的内容复制到本地阵列。
  2. 使用strtok()使用空格作为分隔符来标记每个int
  3. 将令牌转换为int并存储到int阵列。
  4. 继续,直到strtok()返回NULL。
  5. 那就是说,无论如何,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;
}

请注意:

  1. 当您扫描len-1元素或到达字符串末尾时,循环终止。
  2. s1初始文本的char *在每次迭代时递增以跳过空格分隔符(或任何单个字符分隔符)。除非你已经到达字符串的null终止符。
  3. 如果遇到的char不是数字,或者数字之间的间距超过2,则此代码将失败。
  4. 获得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循环的主体中。