Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将字符串转换为long_C++_String_Long Integer_Substr - Fatal编程技术网

C++ 如何将字符串转换为long

C++ 如何将字符串转换为long,c++,string,long-integer,substr,C++,String,Long Integer,Substr,我找到的所有解决方案似乎都使用了Atol,但在我有字符串的情况下,它使用char。例如,我读取一个输入$100,将其放入一个字符串中,并检查第一个字符是否为$。然后我需要将子字符串转换为long类型 int main() { long long price; string priceStr; cin>>priceStr; if (priceStr[0] == '$') { price = convertToLongLong(pric

我找到的所有解决方案似乎都使用了Atol,但在我有字符串的情况下,它使用char。例如,我读取一个输入$100,将其放入一个字符串中,并检查第一个字符是否为$。然后我需要将子字符串转换为long类型

int main() {

    long long price;
    string priceStr;

    cin>>priceStr;
    if (priceStr[0] == '$') {
        price = convertToLongLong(priceStr.substr(1));//how?
    }else{
        cerr<<"error!";
    }

}
intmain(){
多头价格;
字符串priceStr;
cin>>价格;
如果(priceStr[0]='$'){
price=convertToLongLong(priceStr.substr(1));//如何?
}否则{
cerr使用

scanf($%lld,&价格)

编辑

请参阅上面的参考资料。快速简便地格式化输入

if(scanf("%lld %s $%lld #%lld",
  &id, name, &price, &quantity)!=4) fprintf(stderr, "error!");

如果STL是您唯一的选择,您有两个选择:

int main() {

    long long price;
    string priceStr;

    cin>>priceStr;
    if (priceStr[0] == '$') {
        std::istringstream is (priceStr.begin() + 1, priceStr.end());
        is >> price;
        if (!is)
            cerr << "fail!" << endl;
    }else{
        cerr<<"error!";
    }
}
intmain(){
多头价格;
字符串priceStr;
cin>>价格;
如果(priceStr[0]='$'){
istringstream是(priceStr.begin()+1,priceStr.end());
是>>价格;
如果(!is)
cerr读取文档中的字符串


有一种非常明显的方法可以从其中的std::string获取char*

尝试使用stoll

请参阅


我从未尝试过这个

无论你做什么,都不要使用它。你怎么知道这个数字是0还是遇到了错误?有
stoll
strtoll
、字符串流、
boost::lexical\u cast
,以及其他都提供错误检查的功能……你不需要
long
来存储100,我只是以100为例…@ValekHalfHeartHi@chris例如,如果我使用strtoll,它接受(const char*str,char**endptr,int base),但我只有一个字符串,那我该怎么办?谢谢。@Arch1tect,
std::string
的文档清楚地列出了
c_str()
data()
。注意1.这是c风格,2.这不是类型安全的,3.以上所有内容。但它又快又脏;)非常感谢我现在使用你的第一个方法,并将priceStr.begin()+1,priceStr.end()更改为priceStr.substr(1)你也应该处理另一个
cin
流式操作的故障
if(std::cin>>priceStr)…否则…;
。按原样,您可以访问空字符串上的
[0]
——未定义的行为——然后可能尝试构造一个开始迭代器已超过结束迭代器的字符串。Tony D,这就是我注意到没有边界检查的原因。
int main() {

    long long price;
    string priceStr;

    cin>>priceStr;
    if (priceStr[0] == '$') {
        price = boost::lexical_cast<long long>(&*priceStr.begin() + 1, priceStr.size() -1); // throws if it cannot convert.
    }else{
        cerr<<"error!";
    }
}