如何从输入字符串中提取特定位置的字符?

时间:2019-09-21 04:15:39

标签: c++ string

对于我的家庭作业项目,我希望创建一个程序,询问用户他们最喜欢的城市以及他们想要显示哪个字符。用户输入一个数字,代表该字符在他们想要显示的城市中的位置,并且该程序应该在该位置显示字母。

我们尚未学习如何从字符串中提取字符,但是项目的这一部分应该表明我们可以通过Google适当地找到编码解决方案。我发现了一个void函数,它将为我从特定位置提取字符,但是在如何使用它方面完全迷失了。我尝试了几种不同的方法,并以各种可能的方式键入了我可能想到的实现此功能的方法,但该方法没有起作用。

我尝试完全照原样复制在网上找到的示例代码(在此地址找到第一个示例:https://www.geeksforgeeks.org/string-at-in-cpp/),但即使该示例也无法在Visual Studio 2017中运行。

#include <iostream>
#include <string>
using namespace std;
void at(string);
int main()
{
    //variables for favorite city & display character
    string favCity;
    int dispChar;
        //asking user for favorite city
        cout << "Input your favorite city: ";
        cin >> favCity;
        cout << "Which character would you like to display: ";
        cin >> dispChar;
        cout << endl << endl;
        cout << "The user entered: " << favCity << endl;
        cout << "The character at position " << dispChar << " is: " << at();

}

预期结果是计算机将显示“位置(dispChar)处的字符是:(无论字母在用户输入位置dispChar处)”

EX:"The character at position 2 is: e //如果用户输入了底特律城市

我收到错误消息at未定义,当我尝试使用str.at();时会得到str未定义,等等。

3 个答案:

答案 0 :(得分:1)

不需要使用外部函数通过字符串的索引从字符串中提取字符。 std::string本身实现了import 'package:flutter/material.dart'; class LoginForm extends StatefulWidget { @override State<StatefulWidget> createState() { return _LoginFormState(); } } class _LoginFormState extends State<LoginForm> { TextStyle style = TextStyle(fontFamily: 'Montserrat', fontSize: 20.0); OutlineInputBorder textFieldBorder = OutlineInputBorder( borderRadius: BorderRadius.circular(32.0), borderSide: BorderSide(color: const Color(0xff01d277))); final formKey = GlobalKey<FormState>(); @override Widget build(BuildContext context) { /// Username field final usernameField = TextFormField( obscureText: false, style: style, validator: (value) { if (value.isEmpty) return 'Please enter username'; return null; }, decoration: InputDecoration( contentPadding: EdgeInsets.fromLTRB(20.0, 15.0, 20.0, 15.0), hintText: 'Username', border: textFieldBorder, )); /// Password field final passwordField = TextFormField( obscureText: true, style: style, validator: (value) { if (value.isEmpty) return 'Please enter password'; return null; }, decoration: InputDecoration( contentPadding: EdgeInsets.fromLTRB(20.0, 15.0, 20.0, 15.0), hintText: 'Password', border: textFieldBorder, )); /// Login button final loginButton = Material( elevation: 5.0, borderRadius: BorderRadius.circular(30.0), color: Color(0xff01d277), child: MaterialButton( minWidth: MediaQuery.of(context).size.width, padding: EdgeInsets.fromLTRB(20.0, 15.0, 20.0, 15.0), onPressed: () { if (formKey.currentState.validate()) Scaffold.of(context).showSnackBar(SnackBar(content: Text('Done!'))); }, child: Text("Login", textAlign: TextAlign.center, style: style.copyWith( color: Colors.white, fontWeight: FontWeight.bold)), ), ); return Padding( padding: const EdgeInsets.all(36.0), child: Form( key: formKey, child: Column( children: <Widget>[ SizedBox( height: 150, child: Image.asset( 'lib/assets/images/logo_dark.png', fit: BoxFit.contain, ), ), SizedBox(height: 45.0), usernameField, SizedBox( height: 45.0, ), passwordField, SizedBox( height: 45.0, ), loginButton, ], ))); } } 函数,并且还重载了std::string::at运算符。

有两种方法可以做到这一点:

1。

[]

2。

cout << "The character at position " << dispChar << " is: " << favCity.at(dispChar);

答案 1 :(得分:0)

std :: string :: at可用于从给定字符串中按字符提取字符。 char& string::at (size_type idx)

string :: at函数返回特定位置(idx)处的字符。您可以直接在包含类的情况下使用string :: at。Learn More Here

因此,在您的解决方案中,您声明了void at(string);,因此您也需要对其进行定义。 我认为您应该对您的代码进行一些更改。

#include <string>
using namespace std;

void extract_char(string str, int pos)
{
    cout<<str.at(pos);
}
int main(void)
{
    int dispChar;
    string favCity;
    cout<<"Input your favorite city: ";
    cin>>favCity;
    cout<<"Which position would you like to extract the character from(0 to size of city): ";
    cin>>dispChar;
    cout<<endl<<endl;
    cout<<"The user entered: "<<favCity<<endl;
    extract_char(favCity, dispChar-1);
    /*
                  OR
        cout<<"The character at position "<<dispChar<<" is: "<<favCity.at(dispChar-1);
    */
    return 0;
}

答案 2 :(得分:0)

  

项目的这一部分应该表明我们可以通过Google适当地找到编码解决方案。

我可以建议搜索短语“ C ++参考”吗?寻找良好的一般参考可以节省您将来的时间。将您最喜欢的参考文献添加为书签,并在将来使用其主题列表代替互联网搜索。 (在这种情况下,您将直接跳到文档中查找字符串并扫描可用的方法。)