从缓冲区读取整数到C中的数组

时间:2016-03-16 01:23:13

标签: c arrays buffer

所以我试图将已经从键盘读取的int值存储到C中的整数数组中。示例用户输入:

8 99 5 7 8

变量声明:

int k;
int size;
char buf[100];

以上是我的缓冲区和数组的其他变量。 以下是将ints读入缓冲区。

printf("Please enter in the numbers for the array:\n");
fgets(buf, 100, stdin);
buf[strlen(buf) - 1] = '\0';

size = (strlen(buf)/2)+1;

int *array = (int *)malloc(sizeof(int)*size);

这样就可以正确分配我的数组。

int i, j;
for(i = 0, j = 0; i < size; i++, j = j+2)
{
    array[i] = buf[j] - '0';
}

上面的代码实际上有效,但不适用于有两位数的数字,仅适用于低于10且高于0的数字。如何修复我的代码以便正确读取整数? 我试图用for进行sscanf循环,但这只会导致一个数组只包含在所有元素中输入的第一个整数。

4 个答案:

答案 0 :(得分:1)

  

如何修复我的代码以便正确读取整数?

使用strtol()按照@EOF的建议解析字符串。它提供了一个结束指针,它停止了。

long *array = malloc(sizeof *array * size);
if (array == NULL) Handle_OutOfMemory();

char *p = buf;
size_t i;
for(i = 0; i<size; i++) {
  // Cope with white space with nothing after it.
  while (isspace((unsigned char) *p)) p++;
  if (*p == '\0') break;

  char *end;
  errno = 0;
  long num = strtol(p, &end, 10);
  // If no conversion or out of range ...
  if (p == end || errno) {
    fprintf(stderr, "trouble converting `%s` into an integer.\n", p);
    break;
  }
  array[i] = num;
  p = end;
}

// Use array[0] ... array[i-1]

答案 1 :(得分:1)

您可以使用sscanfstrtol从输入字符串中提取数字。在任何一种情况下,每次通话都会给你三条信息:

  • 表示找到了有效号码
  • 该数字的值
  • 输入数组中将找到下一个数字的位置

使用sscanf,返回值表示成功或失败。对于示例代码中的sscanf(见下文),成功时返回值为1,其他任何内容都是失败。如果成功,则将该数字的值放在指定的地址,例如,示例代码中的&temp

这是一个棘手的部分:你需要数组中的位置来开始搜索下一个数字。 sscanf转换为%n进行了特殊转换。 %n的输出是执行转换时消耗的字符数。

在下面的示例代码中,我使用最初指向输入字符串开头的指针ptr。在每次循环传递时,%n中使用sscanf来更新变量n,该变量指示转换当前数字所消耗的字符数。通过在n循环中将ptr添加到for,指针会前进到下一个数字。

int *array = malloc(sizeof(int) * size);
int n = 0;
int i = 0;
for ( char *ptr = buf; *ptr; ptr += n )
{
    int temp;
    if ( sscanf(ptr, "%d %n", &temp, &n) != 1 ) {
        // error: not a number
        break;
    }
    array[i++] = temp;
}

正如@chux在评论中所提到的,在格式字符串"%d %n"中添加空格将在每个数字后面消耗尾随空格并相应地设置n的值。因此,如果输入行仅包含数字,则当for语句检测到*ptr已到达NUL终止符时,循环将结束。但是如果输入包含非数字,那么当break失败时,循环将sscanf。这可用于错误检查。

答案 2 :(得分:0)

如果数字来自stdin,则需要更多努力以字符串形式读取它们并自行转换它们,而不是让标准库为您完成。在这里,我已经硬编码了最多100个整数。循环结束后,i将表示array中有效整数的数量。

int array[100] = {0};
int i = 0;

while (i < 100)
{
    int input;
    int scanresult = scanf("%d", &input);

    if (scanresult == 1)
    {
        // 1 item was successfully scanned
        array[i] = input;
        i++;
    }
    else
    {
        // either EOF was reached or the input was not scannable as an integer
    }
}

答案 3 :(得分:-1)

unsigned int len=0,tmp=0;
char j,isnumber=0;
for(char*i=buf;j=*i;i++)
{
    if(j>='0'&&j<='9')
    {
        tmp=tmp*10+j-'0';
        isnumber=1;
    }
    else
    {
        if(isnumber)
            array[len++]=tmp;
        tmp=0;
        isnumber=0;
    }
}

另外,你不需要

buf[strlen(buf) - 1] = '\0';

size = (strlen(buf)/2)+1;