问题:
我想创建一个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]
注意:我假设输入它总是一串空格分隔的整数。
答案 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]);
}