如何仅使用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
来说,描述有点混乱,因此我将指出一些我在代码中清楚看到的问题 以下是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',)如何仅使用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输出的原因如下: 当到达
当你到达最后一个号码时,你也必须小心,因为没有更多的空格,只有回车“\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