Проблемы с программой, расшифровывающей сопротивление по цвету на C

Я столкнулся с этим полным препятствием, я не совсем хорошо разбираюсь в указателях и обработке файлов atm и uni. двигался так быстро, что я не успеваю...

Ожидаемый ввод из файла — любой из цветов из массива:
input.txt
красный, зеленый, синий
черный, белый, серый
...

который затем выводит в файл:
output.txt
красный, зеленый, синий
Сопротивление в омах: 7000000.000000

черный, белый, серый
Сопротивление в Ом: 1000000.000000
...

мой вывод прямо сейчас:
красный, зеленый, синий
Сопротивление в омах: 0,000000

черный, белый, серый
Сопротивление в Ом: 0,000000

пока вот мой код:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define size 100

double DecodeString(char *inputString){
  const char *kColorTable[10] = {"black", "brown", "red", "orange", "yellow", "green", "blue", "violet", "gray", "white"};
  int i;

  for(i=0; i<10; i++){
    if(strcmp(inputString, kColorTable[i]) == 0){
      return (double)i;
    }
  }
  return -999.0;
}

int main(){
  char color[size], *token, *inputString;
  double resistance, color1, color2, color3;
  double value;


  FILE *fptrin, *fptrout;
  if(((fptrin = fopen("input.txt", "r"))==NULL) || ((fptrout = fopen("output.txt", "w")) == NULL)){
    printf("Error 404: File not found");
    exit(1);
  }

  while(fgets(color, size, fptrin)){
    token = strtok(color, ",");
    DecodeString(token);
    puts("");
    while(token != NULL){
      value = DecodeString(token);
      printf("%s",token);
      token = strtok(NULL, ",");
    }
  }
  //value = DecodeString(color);

  if (color1 == -999.0 || color2 == -999.0 || color3 == -999.0){
    printf("\n\nBad code -- cannot compute resistance\n");
  }

  else{
    resistance = (10.0 * color1 + color2) *pow(10.0, color3);

    if(resistance > 1000){
      printf("\n\nResistance in Kilo-ohms: %f\n",resistance);
    }
    else{
      printf( "\n\nResistance in ohms: %f\n",resistance);
    }
  }

  fclose(fptrin);
  fclose(fptrout);

  getchar();
  return 0;
}

Я застрял в своем цикле strtok, я не совсем уверен, как передать эти значения в функцию и присвоить значения из функции color1, color2, color3 для использования для расчета омов.

Я не понимаю, когда я передаю token в DecodeString, он возвращает только значение первой строки, а не каждой отдельной строки (возможно, мне не хватает цикла for)

У меня есть другой код, в котором я основывал свой код на чьей-то функции:

#include<stdio.h>
#include<stdlib.h>
#include<strings.h>
#include<math.h>
#define size 100

double DecodeString(char *inputString)
{
     const char *kColorTable[11] =
     {"", "black", "brown", "red", "orange", "yellow",
      "green", "blue", "violet", "gray", "white"};
     int i;

     for(i=0; i<11; i++)
     {
         if(strcmp(inputString, kColorTable[i]) == 0)
         {
             return (double)i;
         }
     }
     return -999.0;

}

int main(void){
  char color[size], *token, *inputString;
  double value;

  FILE *fptrin, *fptrout;
  if(((fptrin = fopen("input.txt", "r")) == NULL) || ((fptrout = fopen("output.txt", "w")) == NULL)){
    printf("Error 404: File not found");
    exit(1);
  }

  while(fgets(color, size, fptrin)){
    token = strtok(color, ",");
    DecodeString(token);
    puts("");
    while(token != NULL){
      value = DecodeString(token);
      printf("%s",token);
      token = strtok(NULL, ",");
    }
    //value = DecodeString(token);
    printf("%f\n",value + value) *pow(10.0, value);
  }
    return 0;
}

Я столкнулся с серьезным препятствием и был бы признателен за некоторые объяснения и примеры, чтобы лучше понять, что происходит.


person Jefferson Ponce    schedule 05.12.2016    source источник
comment
Пожалуйста, дайте тестовый ввод, ожидаемый результат и фактический результат.   -  person kaylum    schedule 05.12.2016
comment
Я уже добавил ввод и вывод...   -  person Jefferson Ponce    schedule 05.12.2016
comment
Если ввод содержит пробелы, а также запятые, которые вы хотите использовать в качестве разделителей, тогда вы должны включить пробел во второй strtok, например: token = strtok(color, " ,");   -  person samgak    schedule 05.12.2016
comment
Почему бы вам хотя бы не попытаться установить переменные colorX?   -  person kaylum    schedule 05.12.2016
comment
decodeString возвращает 0 вместо black — это то, что вы хотели? Если вы сообщаете значение в кОм, не нужно ли делить еще и на 1000?   -  person Jonathan Leffler    schedule 05.12.2016
comment
ну, я не совсем уверен, как установить для переменных colorX значения, взятые из файла, переданного через функцию.   -  person Jefferson Ponce    schedule 05.12.2016
comment
Единственное транспортное средство, которое доставит вас куда угодно, — это отладчик.   -  person n. 1.8e9-where's-my-share m.    schedule 05.12.2016


Ответы (1)


Следующая логика будет работать для вас,

1. Объявить двойной массив

double colord[3];

2. Теперь измените цикл while,

while(fgets(color, size, fptrin)){
    token = strtok(color, ",");
    colord[i] = DecodeString(token);
    puts("");
    while(token != NULL){
        i++;
        colord[i] = DecodeString(token);
        printf("%s",token);
        token = strtok(NULL, ",");
    }
}
if (colord[0] == -999.0 || colord[1] == -999.0 || colord[2] == -999.0){
    printf("\n\nBad code -- cannot compute resistance\n");
}
else{
    resistance = (10.0 * colord[0] + colord[1]) * pow(10.0, colord[2]);
person Akshay Patole    schedule 05.12.2016
comment
Спасибо! это работает для меня! Не могу поверить, что я не подумал установить цвет как массив! универ движется слишком быстро, я почти не успеваю! Буду тренироваться и учиться! - person Jefferson Ponce; 05.12.2016