如何将 space 分隔的浮点数从字符串中提取到 c 中的另一个数组中?
How do I extract space separated floating numbers from string into another array in c?
我有这个代码。用户应输入类似“10.0 10.0 4.0 7.0”的内容。而且,我希望我的程序将这些浮点数放入一个数组中,以便可以通过 floats[0] = 10.0, floats[1] = 10.0 floats[2] = 4.0 floats[3 访问每个浮点数] = 7.0。我稍后会让它们成为浮点类型。在这段代码中,我尝试使用二维数组,但肯定有问题。
你能告诉我正确的方向吗?
#include <cs50.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
int main(void)
{
// prompt the user to enter two inputs
string input1 = get_string();
// declare and initialize essential variables
int len1 = strlen(input1);
int j = 0;
// declare an array where the next lines of code should put floats separately
string floats[100][100];
// put each floating point number into an array character by character
for (int i = 0; i < len1; i++) {
if (isspace(input1[i])) {
j++;
} else {
floats[j][i] = input1[i];
}
}
}
您可以像这样使用 stringstream(尽管这是一种 c++ 方式)
std::stringstream ss;
ss.str (input1);
int i = 0;
string t;
while ( ss >> t)
{
floats[i++] = std::stof(t); //fill your array one by one
}
对于纯C方式,可以使用sscanf。
您可以使用strtod()
一次解析一个浮点数的字符串:
#include <cs50.h>
#include <stdio.h>
#include <stdlib.h>
int main(void) {
// prompt the user to enter two inputs
char *input1 = get_string();
// declare the destination array for the floating point numbers
double numbers[100];
int n;
char *p = input1;
char *q;
for (n = 0; n < 100; n++) {
numbers[n] = strtod(p, &q);
if (p == q) {
// no more numbers to parse
break;
}
p = q;
}
// print the array contents
for (int i = 0; i < n; i++) {
printf("%f\n", numbers[i]);
}
return 0;
}
用于解析浮点数。
要使用空格分隔 sub-strings,至少 OP 的代码不会附加所需的空字符。此外,从 input1[]
复制需要复制的不仅仅是一个字符。
// Avoid magic numbers, using define self-documents the code
#define FLOAT_STRING_SIZE 100
#define FLOAT_STRING_N 100
int main(void) {
string floats[FLOAT_STRING_N][FLOAT_STRING_SIZE];
string input1 = get_string();
char *p = input1;
int count;
for (count = 0; count < FLOAT_STRING_N; count++) {
while (isspace((unsigned char) *p) p++;
// no more
if (*p == '[=10=]') break;
int i;
for (i = 0; i<FLOAT_STRING_SIZE-1; i++) {
if (isspace((unsigned char) *p) || *p == '[=10=]') break;
floats[count][i] = *p++; // save character and advance to next one.
}
floats[count][i] = '[=10=]';
}
int count;
for (int c = 0; c < count; c++) {
puts(floats[c]);
}
return 0;
}
我有这个代码。用户应输入类似“10.0 10.0 4.0 7.0”的内容。而且,我希望我的程序将这些浮点数放入一个数组中,以便可以通过 floats[0] = 10.0, floats[1] = 10.0 floats[2] = 4.0 floats[3 访问每个浮点数] = 7.0。我稍后会让它们成为浮点类型。在这段代码中,我尝试使用二维数组,但肯定有问题。
你能告诉我正确的方向吗?
#include <cs50.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
int main(void)
{
// prompt the user to enter two inputs
string input1 = get_string();
// declare and initialize essential variables
int len1 = strlen(input1);
int j = 0;
// declare an array where the next lines of code should put floats separately
string floats[100][100];
// put each floating point number into an array character by character
for (int i = 0; i < len1; i++) {
if (isspace(input1[i])) {
j++;
} else {
floats[j][i] = input1[i];
}
}
}
您可以像这样使用 stringstream(尽管这是一种 c++ 方式)
std::stringstream ss;
ss.str (input1);
int i = 0;
string t;
while ( ss >> t)
{
floats[i++] = std::stof(t); //fill your array one by one
}
对于纯C方式,可以使用sscanf。
您可以使用strtod()
一次解析一个浮点数的字符串:
#include <cs50.h>
#include <stdio.h>
#include <stdlib.h>
int main(void) {
// prompt the user to enter two inputs
char *input1 = get_string();
// declare the destination array for the floating point numbers
double numbers[100];
int n;
char *p = input1;
char *q;
for (n = 0; n < 100; n++) {
numbers[n] = strtod(p, &q);
if (p == q) {
// no more numbers to parse
break;
}
p = q;
}
// print the array contents
for (int i = 0; i < n; i++) {
printf("%f\n", numbers[i]);
}
return 0;
}
要使用空格分隔 sub-strings,至少 OP 的代码不会附加所需的空字符。此外,从 input1[]
复制需要复制的不仅仅是一个字符。
// Avoid magic numbers, using define self-documents the code
#define FLOAT_STRING_SIZE 100
#define FLOAT_STRING_N 100
int main(void) {
string floats[FLOAT_STRING_N][FLOAT_STRING_SIZE];
string input1 = get_string();
char *p = input1;
int count;
for (count = 0; count < FLOAT_STRING_N; count++) {
while (isspace((unsigned char) *p) p++;
// no more
if (*p == '[=10=]') break;
int i;
for (i = 0; i<FLOAT_STRING_SIZE-1; i++) {
if (isspace((unsigned char) *p) || *p == '[=10=]') break;
floats[count][i] = *p++; // save character and advance to next one.
}
floats[count][i] = '[=10=]';
}
int count;
for (int c = 0; c < count; c++) {
puts(floats[c]);
}
return 0;
}