- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
作为 Stephen Kochan 的“C 语言编程”(第 3 版)的建议练习,我想向 strToInt
函数添加一些功能,将字符串转换为整数。如果传递的字符串文字有效(如“123”或“13”),该函数有一个返回类型 int
就可以了。但如果字符串包含任何非数值(例如“12x3”、“foo”),则应打印错误消息并退出函数。由于返回类型是 int
,因此需要返回一个整数,但在这种情况下这可能会产生误导。所以我的问题是,在这种情况下应该返回什么,以便返回的值/类型明确表示已传递了无效的字符串文字并且不会与有效的返回值混淆?
int strToInt(const char string[])
{
int i = 0, intValue, result = 0;
// check whether string passed is a valid literal
while (string[i] != '\0')
{
if (string[i] < '0' || string[i] > '9')
{
printf("ValueError: Invalid literal\n");
return; // what should be returned here?
}
++i;
}
for (i = 0; string[i] >= '0' && string[i] <= '9'; ++i)
{
intValue = string[i] - '0';
result = result * 10 + intValue;
}
return result;
}
最佳答案
// what should be returned here?
您可以在此处返回任何看起来不像有效结果的内容。通常解决这个问题的方法是将结果移动到一个输出参数。从而释放指示操作成功的状态的返回值。例如:
#include <stdbool.h>
bool strToInt(const char string[], int* outInt) {
// check whether string passed is a valid literal
while (string[i] != '\0')
{
if (string[i] < '0' || string[i] > '9')
{
printf("ValueError: Invalid literal\n");
return false;
}
}
int result = 0;
for (int i = 0; string[i] >= '0' && string[i] <= '9'; ++i)
{
intValue = string[i] - '0';
result = result * 10 + intValue;
}
if (outInt) // Or you may move the check earlier and return false too
*outInt = result;
return true;
}
当然,您可以返回任何类型而不仅仅是 bool 值。许多软件系统返回几个整数值之一,这些整数值可能指示操作可能失败的几种方式中的任何一种。因此,错误处理可以更加准确和复杂。
关于c - 故意返回无效值或类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47855641/
首先是我的对象: public class Group { private final ObservableList sourceList; private final Obser
我有一个 Circle 类和一个 Rectangle 类。我现在想创建一个类 FunnyObject,每个类都由一个圆和两个矩形组成。 如果我这样做: class FunnyObject:public
我正在阅读一篇博文 here关于用 node.js 创建一个刮板并遇到了一些有趣的 javascript,我无法完全理解。这正是我想在我的脚本中使用的东西,但作为一个新手,我不想在不知道它们首先做什么
我不明白为什么在成功之后我为什么看不到脚本中的错误(我用谷歌搜索,它只是给出了关于jquery get脚本成功/错误时错误处理的很多答案)。 如果我使用“any” js脚本执行此操作 $.getScr
我目前正在为我公司正在开发的设备( radio 编码器)开发单元测试。 可以通过 SNMP(仅限 v1)访问各种统计信息,其中您可以获得由于各种原因丢弃的 UDP 数据报的数量。 我希望能够发送一个包
这是一个令人费解的问题。我运行良好的 ASP.NET 3.5 应用程序突然开始出现超时错误... System.Data.SqlClient.SqlException:超时已过。操作完成前超时时间已过
我正在尝试掌握 C++ 内存管理的窍门,并尝试使用无限循环的新语句故意使我的程序崩溃。据我了解,这只会在内存堆上保留越来越多的空间。但是我的程序不会崩溃。在 Windows 任务管理器中监控它,它将使
我是一名优秀的程序员,十分优秀!