斯堪夫在博兰德C++建造者
scanf in Borland C++ Builder
我正在尝试使用函数扫描检查变量的类型。它适用于 Dev C++(我的输入是 int),但它不使用 Borland。这是我尝试过的:
AnsiString as = Edit1->Text;
string b = as.c_str();
int testb = atoi(b.c_str());
if(scanf("%i", &testb)==1){
do sth;
}
有什么想法吗?
[编辑1] 移自 Spektre 的评论
我还有一个问题。我的输入值应该看起来像xx-xx-xxxx
所以它是一个日期。
我必须检查日,月和年是否是整数。
我试过这样:
AnsiString a = Edit1->Text;
date = a.c_str();
if (a==AnsiString().sprintf("%i",atoi(a.SubString(0,2).c_str()))
&& a==AnsiString().sprintf("%i",atoi(a.SubString(3,2).c_str()))
&& a==AnsiString().sprintf("%i",atoi(a.SubString(6,4).c_str())) )
{
//do sth
}
- 但它只检查一天。有谁知道为什么?——J. B. 20小时前
你正在使这变得比它应该的要复杂得多。
scanf()
从 STDIN 读取,但 GUI 进程不使用 STDIN 进行输入,这就是它不适合您的原因。 请改用sscanf()
:
int testb;
if (sscanf(AnsiString(Edit1->Text).c_str(), "%d", &testb) == 1)
{
// do sth ...
}
或者,改用 RTL 的TryStrToInt()
:
int testb;
if (TryStrToInt(Edit1->Text, testb))
{
// do sth ...
}
至于检查日期字符串,您可以使用sscanf()
:
int day, month, year;
if (sscanf(AnsiString(Edit1->Text).c_str(), "%2d-%2d-%4d", &day, &month, &year) == 3)
{
// do sth ...
}
或使用 RTL 的TryStrToDate()
:
TDateTime testb;
TFormatSettings fmt = TFormatSettings::Create();
fmt.DateSeparator = '-';
fmt.ShortDateFormat = "d-m-y";
if (TryStrToDate(Edit1->Text, testb, fmt))
{
// do sth ...
}
我就是这样做的
AnsiString s=Edit1->Text; // copy to real AnsiString ... the AnsiStrings inside visual components are not the same ... some functions/operations does not work properly for them
int e,i,l=s.Length();
for(e=0,i=1;i<=l;)
{
e=1; // assume it is integer
if (s[i]=='-') i++; // skip first minus sign
for (;i<=l;i++) // scan all the rest
if ((s[i]<'0')||(s[i]>'9')) // if not a digit
{
e=0; // then not an integer
break; // stop
}
break;
}
// here e holds true/false if s is valid integer
now you can use safely
if (e) i=s.ToInt(); else i=0;
- 不确定
s.ToInt()
是否也这么有问题,但至少在BDS2006之前 - 如果调用
s.ToDouble()
以获取无效号码,则会引发无法屏蔽的异常 - 因此,例如,如果您尝试转换
0.98
并且小数点未设置为.
程序崩溃(Atoi 和 ATOF 是安全的)
你也可以使用 sprintf:
AnsiString s=Edit1->Text;
if (s==AnsiString().sprintf("%i",atoi(s.c_str()))) /* valid integer */;
相关文章:
- 模板化建造师专业化
- 在哪里放置我的函数?进入我的母语 Gui 还是进入我的演示者?
- 如何设计具有不同类型的通知和观察器的观察者模式?
- 如何将事件循环中的事件分派给订阅者?
- 为什么禁止建造 istreams?
- ZeroMQ (cppzmq) 订阅者,过滤器以相同的字符串开头
- 通过 OpenSSL C++从证书获取颁发者证书
- ZeroMQ(cppzmq)订阅者跳过第一条消息
- 反射 + 函数指针与观察者模式
- 观察者模式不起作用
- C++ 传递对匿名者的引用可以吗?
- 具有 NodeJS 订阅者的 ZMQ 发布服务器
- 如何在主函数中访问订阅者类的公共变量?
- 获取来电者的回信地址
- 您将如何在现有的QT Creator GUI项目中实现ROS发布者和订阅者?
- 我可以在Embarcadero C 建造者中为Android(*.so)构建共享库
- C 建造者Clang STD :: Sill,找不到超载的操作员&lt;
- GTKMM:如何在没有建造者的情况下创建弹出菜单
- C++建造者 - 件.cpp(20): E2316 'Button1Click'不是'TForm'的成员
- 斯堪夫在博兰德C++建造者