2017-01-13 27 views
0

У меня этот код. Пользователь должен ввести что-то вроде этого «10.0 10.0 4.0 7.0». И я хочу, чтобы моя программа помещала эти числа с плавающей запятой в массив, чтобы каждый из них был доступен через float [0] = 10.0, floats [1] = 10.0 floats [2] = 4.0 floats [3] = 7.0 , Я бы сделал их типы с плавающей запятой позже. В этом коде я пытаюсь использовать двумерный массив, но что-то определенно неправильно.Как извлечь пространственно разделенные плавающие числа из строки в другой массив в c?

Можете ли вы поставить меня на правильный путь?

#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]; 
     } 
    } 
} 
+0

'floats [j] [i]': использовать другую переменную вместо 'i'. или используйте 'strtok' и' strcpy'. – BLUEPIXY

+1

Просто FYI. Если это для CS50x Coding Contest, вы действительно не должны запрашивать внешнюю помощь. Не большая часть конкурса, если кто-то другой решает его для вас. – curiouskiwi

+0

Я на самом деле не собираюсь побеждать в этом конкурсе, я нахожусь только на опыте. 'strtod()' был вне моего знания, я никогда не использовал его и не мог найти его в Интернете. Поэтому я никогда не смогу решить это без помощи людей здесь. –

ответ

0

Вы можете использовать stringstream (хотя это с ++ способ), как этот

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.

+4

Для вопроса C, решение C не должно быть запоздалой мыслью. –

+2

Этот человек использует cs50 (yuck), что означает, что они берут колыбель * начало * C курс. Ответ на другом языке, вероятно, вряд ли поможет, особенно тот, который не объясняется подробно. – WhozCraig

+0

Я собирался поставить записку о том же в моем посте. Говоря, что OP использует 'string' в своей программе уже, так что это не чисто C в любом случае. Если бы он использовал char * вместо этого, я бы упомянул только sscanf – 16tons

1

Вы можете использовать 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; 
} 
2

strtod() is the best tool для анализа чисел с плавающей запятой.

Чтобы отделить подстроки с использованием пробелов, минимальный код 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 == '\0') break; 

    int i;    
    for (i = 0; i<FLOAT_STRING_SIZE-1; i++) { 
     if (isspace((unsigned char) *p) || *p == '\0') break; 
     floats[count][i] = *p++; // save character and advance to next one. 
    } 
    floats[count][i] = '\0'; 
    } 

    int count; 
    for (int c = 0; c < count; c++) { 
    puts(floats[c]); 
    } 

    return 0; 
} 
+0

Исправлен код. – chux