如何仅使用1D数组将字符串中的间隔数字提取到浮点数组中? #包括 #包括 #包括 #定义尺寸20 int main() { int-num; 浮动值[大小]; 整数大小; int size_j; 整数大小; int i=0; int j; 炭垫[尺寸]; int键; printf(“输入行的大小:”); scanf(“%i”和“大小”); getchar(); printf(“输入列的大小:”); scanf(“%i”&size_j); getchar(); 尺寸=尺寸_r*尺寸_j; printf(“请输入矩阵(一次一行,间隔数字):”; 对于(num=0;num

如何仅使用1D数组将字符串中的间隔数字提取到浮点数组中? #包括 #包括 #包括 #定义尺寸20 int main() { int-num; 浮动值[大小]; 整数大小; int size_j; 整数大小; int i=0; int j; 炭垫[尺寸]; int键; printf(“输入行的大小:”); scanf(“%i”和“大小”); getchar(); printf(“输入列的大小:”); scanf(“%i”&size_j); getchar(); 尺寸=尺寸_r*尺寸_j; printf(“请输入矩阵(一次一行,间隔数字):”; 对于(num=0;num,c,C,来说,描述有点混乱,因此我将指出一些我在代码中清楚看到的问题 以下是atof工作原理的定义: 解析C字符串str,将其内容解释为浮点数,并将其值返回为双精度 函数首先根据需要丢弃尽可能多的空白字符(如在isspace中),直到找到第一个非空白字符。然后,从该字符开始,按照类似于浮点文本的语法,尽可能多地使用有效字符(见下文),并将其解释为数值。忽略最后一个有效字符后的字符串其余部分,并且对此函数的行为没有影响。 " 理解定义的最后一句话是理解问题的关键 每次获得12.00输出的原因如下: 当到达

来说,描述有点混乱,因此我将指出一些我在代码中清楚看到的问题

以下是atof工作原理的定义:

解析C字符串str,将其内容解释为浮点数,并将其值返回为双精度

函数首先根据需要丢弃尽可能多的空白字符(如在isspace中),直到找到第一个非空白字符。然后,从该字符开始,按照类似于浮点文本的语法,尽可能多地使用有效字符(见下文),并将其解释为数值。忽略最后一个有效字符后的字符串其余部分,并且对此函数的行为没有影响。 "

理解定义的最后一句话是理解问题的关键

每次获得12.00输出的原因如下: 当到达第一个空格并调用atof()时,atof函数会看到字符:12+空格,因此12被提取并转换为Float

随后,当您找到一个空格时,函数将看到12(空格)23(空格),并且忽略(23空格)段。循环atof的每个后续迭代将仅返回12.0000

要解决此问题,您需要定义一个char指针,该指针最初设置为mat的第一个数字,chrPtr=mat。随后,当您找到一个空间时,您对char ptr=val[i]=atof(chrNum)执行atof

然后需要将char ptr凹凸到下一个数字字符之前的空格 chrNum=strchr(mat',)


当你到达最后一个号码时,你也必须小心,因为没有更多的空格,只有回车“\n”。这种情况也必须处理。

如果我理解你的要求,有几个明显的混淆。第一个围绕着
大小
大小
。如果你同时要求
size_r
size_j
,那么
size
就是您检查的数组限制,看看您的
val[size]
是否可以容纳
size_r*size_j
元素。在这种情况下,您不能将
size
用作迭代限制

但是,如果只输入一个值(例如
size\u r
size\u j
,但不能同时输入两个值),则可以使用
size
修复未输入的值。
size/size\r
修复
size\u j
)当然,您仍然必须确保整数除法不会导致修复大于元素的大小

接下来,没有什么神奇的方法可以用一维数组来模拟二维矩阵。您可以找到很多文献,讨论用于从一维数组索引二维矩阵的跨距(或列数)。可以按如下方式处理用于模拟二维数组的数组索引(打印示例):

将所有的片段放在一起,注意在转换为
float
之前不需要填充
字符串数组,您可以执行以下操作:

array[i * size_j][j];
最后,始终,始终,检查用于获取用户输入的任何函数的返回值,然后验证输入的值是否在可用范围内。(据您所知,可能有一只猫正在踩键盘)。如果您始终验证输入(并在启用警告的情况下编译,例如
-Wall-Wextra
),您会发现调试时间大大缩短

看看所有的答案,如果我不明白你到底在找什么,请在评论中告诉我

for (i = 0; i < size_r; i++) {   /* output your values in 2D format */
    for (j = 0; j < size_j; j++)
        printf ("%7.2f", val[i * size_j + j]);
    putchar ('\n');    /* for your newline */
}
array[i * size_j][j];
#include <stdio.h>

#define SIZE 20

int main (void)
{
    int size_r, size_j, size, i, j;
    float val[SIZE];

    printf ("Enter size of rows: ");
    if (scanf ("%d", &size_r) != 1) {   /* always validate input */
        fprintf (stderr, "error: invalid conversion for rows.\n");
        return 1;
    }

    printf ("Enter size of columns: ");
    if (scanf ("%d", &size_j) != 1) {   /* ditto */
        fprintf (stderr, "error: invalid conversion for rows.\n");
        return 1;
    }

    size = size_r * size_j; /* compute the requires size of array */

    /* you can only use SIZE as a limit unless you only ask for a row   */
    if (size > SIZE) {  /* or col, and set the other with e.g. SIZE/row */
        fprintf (stderr, "error: SIZE (%d) insufficient to hold "
                            "size (%d) elements.\n", SIZE, size);
        return 1;
    }

    printf ("Please input matrix (one row at a time and spaced numbers): ");
    for (i = 0; i < size_r; i++)     /* your indexing is: array[i*size_j][j] */
        for (j = 0; j < size_j; j++)
            if (scanf ("%f", &val[i * size_j + j]) != 1) {
                fprintf (stderr, "error: conversion for val[%d][%d] failed.\n",
                        i * size_j, j);
                return 1;
            }
    putchar ('\n');     /* just to make it look nice piping input to it */

    for (i = 0; i < size_r; i++) {   /* output your values in 2D format */
        for (j = 0; j < size_j; j++)
            printf ("%7.2f", val[i * size_j + j]);
        putchar ('\n');
    }

    return 0;
}
$ echo 5 4 {1..20}.0 | ./bin/spcarrayfloats
Enter size of rows: Enter size of columns: Please input matrix <snip>:
   1.00   2.00   3.00   4.00
   5.00   6.00   7.00   8.00
   9.00  10.00  11.00  12.00
  13.00  14.00  15.00  16.00
  17.00  18.00  19.00  20.00