【问题标题】:FIle handline operations and enum function in CC中的文件处理操作和枚举函数
【发布时间】:2016-12-04 19:13:21
【问题描述】:

我目前的任务是为从文件读取的电阻解码器编写代码。

具体来说,我的代码必须从文件输入中读取,该文件输入具有由逗号分隔的三个颜色带: 输入.txt

红、绿、蓝
黑色、橙色、黄色

然后它必须使用从 0 一直到 9 的每种颜色的一组值来解码这些颜色

最后,它必须计算每种颜色加起来的阻力乘以 10^n

例如,如果第一个波段是红色,第二个是绿色,第三个是蓝色,则电阻值为 50 × 103 欧姆。

编辑:这是我现在的代码,我仍然不知道如何将值从我的 strtok 传递给函数,我不太擅长使用指针,它让我和文件处理一起搞砸了,所以我真的不知道我的循环中发生了什么(事实上,这是我教授的循环代码,她让我们开始使用)自从大学以来,我几乎没有在这些主题上进行过任何练习。移动得太快了,所以我没有太多经验。

对我的 strtok 循环以及如何将其值传递给函数的解释会很好,并且一些示例可以更好地理解它会很棒!

#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 code;
  char color[size], *token, code1, code2, code3, *inputString;
  double resistance, color1, color2, color3;
  double value = DecodeString(inputString);


  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 - 1, fptrin)){
    token = strtok(color, ",");
    puts("");
    while(token != NULL){
      printf("%s",token);
      token = strtok(NULL, ",");
      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;
}

我一直在根据您给我的功能进行一些练习和测试,但我仍然无法弄清楚如何使事情起作用。我在这里遇到了一个完全的障碍,我不确定下一步该怎么做:/

#include<stdio.h>
#include<stdlib.h>
#include<strings.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(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 - 1, fptrin)){
    token = strtok(color, ",");
    DecodeString(color);
    puts("");
    while(token != NULL){
      printf("%s",token);
      token = strtok(NULL, ",");
    }
    //printf("color value: ");
    printf("%f\n", value);
  }
    return 0;
}

【问题讨论】:

  • 您应该查看proper C formatting。或了解如何thoroughly obfuscate your code。
  • 您需要将来自 strtok 循环的字符串转换为从 0 到 9 的值的代码。现在 code 未使用。考虑建立一个字符串名称表,并按顺序与每个字符串进行比较。将字符串排成一行,以便在表格中放置它们的值。然后,当您遍历可能的字符串时,循环的索引将是您的数学运算所需的整数值。
  • 除了前面的注释之外,您还比较了fgets 的返回值(它返回一个指向char 的指针)和EOF,它是一个int。我认为您需要将其与NULL 进行比较。
  • 另外,fgets 不采用像“%s”这样的格式说明符。也许您的意思是使用sscanf。如果您打算使用fgets,它的第二个参数是int,指定输入缓冲区的大小,而不是字符串。
  • 另外,您对不存在的输入文件的检查不起作用。你应该把它改成if(((fptrin = fopen("input.txt", "r"))==NULL) || ((fptrout = fopen("output.txt", "w")) == NULL)){

标签: c


【解决方案1】:

我已经包含了一个迷你函数,它接受一个字符串并将其解析为一个双精度值。这是您缺少的逻辑的一部分。剩下的就交给你了。

#include <strings.h>

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(stricmp(inputString, kColorTable[i]) == 0)
         {
             return (double)i;
         }
     }

     return -999.0;
}

int main(void)
{
    double value = DecodeString("blue");
    printf("%f\n", value );
    return 0;
}

【讨论】:

  • 我编辑了我的代码以正确读取 strtok 循环的文件,但我仍然不确定如何将其值传递给函数并返回,没有太多经验与指针 atm 和 uni。移动得太快了,我跟不上。了解我的 strtok 循环及其现在的工作原理以及一些帮助我更好理解的示例会很棒!
  • strtok 是一个相当复杂的软件。它根据您作为第二个参数传递的“令牌”字符串将字符串拆分为子字符串。如果您将 NULL 传递给第一个,它会继续拆分传入的最后一个字符串。基本上,您的外观正在遍历字符串,将其分解为列表中的每个逗号。请参阅stackoverflow.com/questions/3889992/… 了解更多信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
  • 2019-04-12
  • 1970-01-01
相关资源
最近更新 更多