在Borland C ++ Builder中的scanf

时间:2014-11-20 09:26:42

标签: c++ scanf c++builder builder borland-c++

我正在尝试用函数scanf检查我的变量的类型。它适用于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;
}

有什么想法吗?

[edit1]从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小时前

2 个答案:

答案 0 :(得分:1)

你正在使它变得非常复杂。

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 ...
}

答案 1 :(得分:0)

我是这样做的

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 */;