Как вывести строку, второе слово, первую букву?

#c

#c

Вопрос:

Мне нужно решение для этого кода, оно почти готово, но я не понимаю, как я могу получить первую букву из второго слова, а не первую? В этом коде я получаю 1-ю букву первого слова и не знаю, как исправить, чтобы получить первую букву из второго слова строки, которая вводится пользователем.

 #include <iostream>
#include <string>
using namespace std;

int main()
{
    string s, krt;
    int sk;
    cout << "Enter Array: ";
    getline(cin, s);
    sk = s.length();
    cout << "Character in string: " << sk << endl;
    int i, vst = 0, bas = 0;
    for (i = 0; i < sk; i  ) {
        krt = s.substr(i, 1);
        if (krt == " ")
            vst = vst   1;
    }
    cout << "Spaces count in string: " << vst << endl;
    char tpb;
    tpb = s[0];
    int pbk;
    pbk = tpb;
    cout << "String second word first letter: " << tpb << " and its ASCII code: " << pbk << endl;

    return 0;
}
 

Надеюсь, вы понимаете, что мне нужно получить.

Комментарии:

1. Примечание: вы можете заменить: krt = s.substr(i, 1); if ... на: if (s[i] == ' ') .... или еще лучше: if (std::isspace(s[i])) ....

Ответ №1:

Основная проблема заключается в том, что вы используете 0 в качестве индекса вместо того, чтобы хранить нужный вам индекс; первый символ без пробела, который следует за пробелом. По крайней мере, это определение, которое я собираюсь предположить — вы не указали, что делать для нескольких последовательных пробелов, а также строк, содержащих не алфавитные символы, такие как «function()», где vim сказал бы, что ‘(‘ является первым символом второго слова. Расширение приведенного ниже кода для этого оставлено читателю в качестве упражнения.

В вашем коде есть много других проблем; объявления, которые можно объединить с определением, выполнение сравнения строк, где вам нужно сравнить только один символ, и использование циклов for, где вместо этого есть алгоритмы для выбора. Вместе они добавляют много шума в код.

Наконец, вам нужен некоторый код для обработки случая отсутствия второго слова, чтобы не получить неопределенное поведение, как в коде @Diodacus.

С помощью обычных циклов for:

 #include <iostream>
#include <string>
using namespace std;

int main()
{
    string s;
    cout << "Enter Array: ";
    getline(cin, s);
    const int sk = s.length();
    cout << "Character in string: " << sk << endl;
    int vst = 0;
    bool space_has_passed = false;
    int first_nonspace_after_space_index = -1;
    for (int i = 0; i < sk; i  ) {
        if (s[i] == ' ') {
            vst = vst   1;
            space_has_passed = true;
        } else if (space_has_passed amp;amp; first_nonspace_after_space_index == -1) {
            first_nonspace_after_space_index = i;
        }
    }
    cout << "Spaces count in string: " << vst << endl;
    if ( first_nonspace_after_space_index != -1 amp;amp; sk > first_nonspace_after_space_index) {
        const char tpb = s[first_nonspace_after_space_index];
        const int pbk = tpb;
        cout << "String second word first letter: " << tpb << " and its ASCII code: " << pbk << endl;
    } else {
        cout << "Need at least two words" << endl;
    }
    return 0;
}
 

Вы можете сократить его на 7 строк, если используете <algorithms> :

 #include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main()
{
    string s;
    cout << "Enter Array: ";
    getline(cin, s);
    const int sk = s.length();
    cout << "Character in string: " << sk << endl;
    auto first_space = std::find(s.begin(), s.end(), ' ');
    auto first_nonspace_afterspace = std::find_if(  first_space, s.end(), [](const char amp; c){ return c != ' '; });
    int count_spaces = std::count(s.begin(), s.end(), ' ');
    cout << "Spaces count in string: " << count_spaces << endl;
    if( first_nonspace_afterspace != s.end() ) {
        const char tpb = *first_nonspace_afterspace;
        const int pbk = tpb;
        cout << "String second word first letter: " << tpb << " and its ASCII code: " << pbk << endl;
    } else {
        cout << "Need at least two words" << endl;
    }
    return 0;
}
 

Ответ №2:

Я предлагаю вам кратко взглянуть на страницу документации по классу string (http://www.cplusplus.com/reference/string/string /), существует множество функций, которые могут помочь вам манипулировать строкой.

На основе функций, доступных в этом классе (например, cbegin() , cend() , find() , c_str() , и т.д.), Вы могли бы сделать что-то вроде этого:

 #include <iostream>
#include <string>
#include <ctype.h>
using namespace std;

int main()
{
    string s;
    cout << "Enter array: ";
    getline(cin, s);
    int sk = s.length();
    cout << "Character in string: " << sk << endl;
    int vst = 0;
    for (auto i=s.cbegin(); i!=s.cend();   i)
        if(isspace(*i)) vst  ;
    cout << "Spaces count in string: " << vst << endl;
    string t = s.substr(s.find(" ")   1, 1);
    char tpb = *t.c_str();
    int pkt = tpb;
    cout << "String second word first letter: " << tpb << " and its ASCII code: " << pkt << endl; 
    return 0;
}
 

Основная проблема заключается в том, что вы печатаете первую букву строки, переданной в параметре:

tpb = s[0];

Вы должны либо:

  • запомните индекс расположения первого символа второго слова

или

  • получите второе слово строки, переданной в параметре, и выведите первый символ этой строки

Наконец, что происходит, когда передается только одно слово?

Вы также должны подумать об этом. В приведенном выше коде, если вы передаете слово test , программа все равно печатает String second word first letter: t and its ASCII code: 116 , что неверно.

Ответ №3:

Попробуйте это:

 #include <iostream>
#include <string>

using namespace std;

int main ()
{
    string s, krt;

    int sk;
    cout << "Enter Array: ";
    getline (cin, s);
    sk = s.length();
    cout << "Character in string: " << sk << endl;

    int i, vst = 0, bas = 0; 
    for (i = 0; i < sk; i  )
    {
        krt = s.substr(i, 1);
        if (krt == " ") vst = vst   1;
    }
    cout << "Spaces count in string: " << vst << endl;

    char tpb;
    for (i = 0; i < sk;   i) // Searching for first space
    {
        if (s[i] == ' ')
            break;
    }
    tpb = s[i   1];

    int pbk;
    pbk = tpb;
    cout << "String second word first letter: " << tpb << " and its ASCII code: " <<           pbk << endl;

    return 0;
}
 

Это должно сработать.

Комментарии:

1. 1) У вас нет второго for цикла. Достаточно первого. 2) tpb = s[i 1]; Что, если s[i] это последняя буква?

2. примечание; неопределенное поведение, если нет пробелов или первый пробел является последним символом строки.