【问题标题】:Checking function parameter data type in C++在 C++ 中检查函数参数数据类型
【发布时间】:2013-02-24 21:14:17
【问题描述】:

这个类函数 CLASS::READWRITE 应该从输入文件读取数据并写入输出文件,前提是它的输入值是 int 类型。当我输入一个浮点值作为 x 传递时,小数位被截断并且函数正常执行而不是输出警告。如果像“b”这样的小写字母作为 x 传递,则该值显然被读取为“0”,因此函数正常执行而不是输出警告。

如何执行检查 (x != int)?我已经看到了使用 cin.fail() 的建议,但我在这里没有使用 cin。

#include <iostream>
#include <fstream>
using namespace std;

ifstream input_file("in_file", ios::in);
ofstream output_file("out_file", ios::out);

int main(void)
{
    CLASS object(n);                // n is the number of values held in in_file
    object.READWRITE(x);            // x is some test value

}

void CLASS::READWRITE(int x)
{
    int i;
    for(i = 0; i < n; i++)
    {
        input_file >> number[i];
    }

    for(i = 0; i < n; i++)
    {
        if((x != int) || (x < 0))
        {
            out_file << "Error" << endl;
            break;
        }
        else
        {
            out_file << num[i] << endl;
        }
    }
}

【问题讨论】:

  • 在我看来,您正在寻找typeof 函数。虽然它不在 C 标准中,但它仍然被广泛使用。检查此链接stackoverflow.com/questions/12081502/typeof-operator-in-c。另外,关于您的其他问题……您正在遭受“隐式转换”的困扰。大多数简单的数据类型(char、int、float 等)都可以相互隐式转换。你会失去精确度,但就是这样。如果您真的想知道文件中的内容是什么,则需要检查字符串,而不是数字。
  • 整数字符串和其他字符串有什么区别?
  • 很简单。扫描任何不是整数的东西。第一步:获取字符串(两个分隔符之间的任何内容,如空格、换行符等)。 第二步:检查该字符串中不是数字的任何内容。如果有任何东西不在 48-57 的范围内(包括 0-9 的 ASCII 值),则它不是整数。

标签: c++


【解决方案1】:

这并不是您要查找的内容,但如果您想确保只传输整数,则必须检查字符串。虽然您特别要求使用 C++,但我更喜欢处理 C 文件,所以请多多包涵。

FILE *fp = fopen("input.file", "rb"), op = fopen("output.file", "wb");
if(fp && op) {
     while(!feof(fp)) {
         char buffer[20], *ptr = buffer;
         fscanf(fp, "%20[^\s\n]", buffer);
         while(ptr && *ptr != 0) {
             if(*ptr >= '0' && *ptr <= '9') ++ptr;
             else ptr = 0;
         }
         if(ptr) fprintf(op, "%s", buffer);
     }
     fclose(fp);
     fclose(op);
}

简而言之,此代码扫描整个文件以查找由空格或换行符分隔的块(假设任何一个数字不超过 20 个字符。)在下一步中,它会检测有问题的字符是否是一个数字(在这种情况下,指针向上移动一步),或者不。在后一种情况下,字符串作为整数无效并被丢弃(指针设置为 0,这反过来又使循环后的“写”无效。

我相信这应该可以满足您的需求。

【讨论】:

    【解决方案2】:

    您将参数 x 声明为 int,所以它是 int

    void CLASS::READWRITE(int x)
    

    当你传入一个 double 或 char 时,编译器会隐式地将它们转换为一个整数值。对于双精度数,这意味着在小数点后截断,对于字符数,编译器将 ascii 表示视为整数。

    假设和这里的其他人一样,参数 x 来自用户/文件输入,您必须手动检查每个输入字符串以确保它是有效整数。如果输入是二进制的,那么由于数据是上下文敏感的,所以真的无法分辨。

    【讨论】:

      猜你喜欢
      • 2011-11-24
      • 2021-12-09
      • 2021-10-18
      • 2011-06-10
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-21
      相关资源
      最近更新 更多