#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. примечание; неопределенное поведение, если нет пробелов или первый пробел является последним символом строки.