C程序将空间分隔的int的输入字符串转换为int数组

时间:2016-06-11 06:55:47

标签: c arrays io

问题:

我想创建一个C程序,它将一串空格分隔的int作为输入(正数和负数,可变位数),并将字符串转换为int数组。

还有一个问题是从字符串输入到Stack Overflow上的数组中读取整数,但它不适用于数字长度大于1或负数的数字。

尝试:

#include <stdio.h>
int main () {
  int arr[1000], length = 0, c;
  while ((c = getchar()) != '\n') {
    if (c != ' ') {
      arr[length++] = c - '0';
    }
  }
  printf("[");
  for ( int i = 0; i < length-1; i++ ) {
    printf("%d,", arr[i]);
  }
  printf("%d]\n", arr[length-1]);
}

如果我在终端输入以下内容:

$ echo "21 7" | ./run
$ [2,1,7]

这是我得到的数组:[2,1,7]而不是[21,7]

如果我输入以下内容:

$ echo "-21 7" | ./run
$ [-3,2,1,7]

我得到:[ - 3,2,1,7]而不是[-21,7]这没有任何意义。

但是,如果我输入:

$ echo "1 2 3 4 5 6 7" | ./run
$ [1,2,3,4,5,6,7]

注意:我假设输入它总是一串空格分隔的整数。

4 个答案:

答案 0 :(得分:4)

这是一个准系统版本(没有错误检查,数字后应留下尾随空格),我相信你可以从这里拿起:

int main(void)
{
    int c;
    int i, num = 0, neg = 0;
    while ((c = getchar()) != EOF) {
        if (c != ' ') {
            if (c == '-') {
                neg = 1;
            } else {
                i = c - '0';
                num = num * 10 + i;
            }
        } else {
            (neg == 1) ? num *= -1 : num;
            printf("%d\n", num + 2);    // this is just to show that you indeed get an integer and addition works
            num = 0;
            neg = 0;
        }
    }
}

答案 1 :(得分:3)

完整程序(改编自this answer by @onemasse)(不再需要无效输入来停止阅读输入):

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

int main () {
    int arr[1000], length = 0, c, bytesread;
    char input[1000];
    fgets(input, sizeof(input), stdin);
    char* input1 = input;
    while (sscanf(input1, "%d%n", &c, &bytesread) > 0) {
        arr[length++] = c;
        input1 += bytesread;
    }
    printf("[");
    for ( int i = 0; i < length-1; i++ ) {
        printf("%d,", arr[i]);
    }
    printf("%d]\n", arr[length-1]);
    return 0;
}

来自scanf / sscanf手册页:

  

这些函数返回分配的输入项数。如果匹配失败,这可能比提供的数量少,甚至为零。

因此,如果返回值为0,您就知道它不再能够转换。

样本I / O:

$ ./parse
1 2 3 10 11 12 -2 -3 -12 -124
[1,2,3,10,11,12,-2,-3,-12,-124]

注意:我目前不确定这是如何工作的。我会仔细看看的。但是,如果有人理解,请编辑此帖或发表评论。

答案 2 :(得分:1)

我做的不多,但这是我的去处:)。

erase

答案 3 :(得分:1)

编辑了一下。但是还有减号问题。我稍后回顾一下。如果你稍微调整一下,我猜,它可能会奏效。你尝试自己的方式。我会试试我的。但是后来。

#include <stdio.h>
int main () {
  int arr[1000]={0}, length = 0, c, i;
  while (1) {
    c = getchar();

if(c=='-')
{
    //minus sign has problem yet. I ll come back once I have better soln.
}
else if(c==' ' || c=='\n')
{
    length-=2;
    arr[length]= arr[length]*10 + arr[length+1];
    length++;
    if(c=='\n')
    {
        break;
    }
}
else if (c != ' ') {
  arr[length++] = c - '0';
    }
 }
  printf("[");
  for (i = 0; i < length-1; i++ ) {
 printf("%d,", arr[i]);
  }
  printf("%d]\n", arr[length-1]);
}