#c #for-loop #vector
Вопрос:
Попытка определить, является ли индексная запись вектора строк буквой или цифрой. Я пытаюсь использовать isdigit()
, но это не сработает, потому что подходящее преобразование не может быть выполнено с помощью isdigit(stof(eq[i]))
По сути, если я обнаружу, что это буква, я хочу изменить это значение на 0.
#include string
#include vector
using namespace std;
vector <string> eq;
eq[0] = "a";
eq[1] = "3.5";
eq[2] = "7.5";
for (int i = 0; i < eq.size(); i )
{
try {
isdigit(stof(eq[i]));
throw(eq[i]);
}
catch (exception e) {
cout << "eq[i] is not a number" << endl;
eq[i] == "0";
cout << "eq[i] = " << eq[i] << endl;
}
}
Вопрос в том, как я мог бы оценить, является ли значение индекса буквой, а затем, если да, заменить эту букву нулем?
Комментарии:
1.
stof
возвращает adouble
. Какisdigit
это имеет смысл делать?isdigit
проверяет один символ .2. Я понимаю , почему вы, возможно, захотите использовать
isdigit
, но почему вы хотите использоватьstof
???3.
eq
имеет нулевой размер при создании. Назначениеeq[0]
,eq[1]
, иeq[2]
без предварительного изменения размера вызывает неопределенное поведение. И не используйте исключения для управления потоком в рамках одной функции. Посмотритеif
заявление.4.
isdigit
проверяет один символ.eq[1] = "3.5";
это строка, если вы хотите проверить первый символeq[1]
, чтобы убедиться, что это цифра, которую вы можете сделатьisdigit(eq[1][0])
, но я не думаю, что это то, что вы хотите сделать. Если вы пытаетесь преобразоватьeq[1]
в значение с плавающей точкой, тоstof
будет работать без проверки возвращаемого значения — но для этого и предназначен второй параметрstof
— чтобы сообщить вам, сколько можно преобразовать. Поэтому вам нужно использовать второй параметрstof
вместо проверки возвращаемого значения с помощьюisdigit
5. Следует сказать, что это не мой исходный код, это то, что я собрал вместе, чтобы попытаться воссоздать его. Я использовал stof, потому что остальные значения являются плавающими, и подумал, что если он не сработает на начальном, я мог бы переназначить его и продолжить свой цикл
Ответ №1:
Как насчет того, чтобы просто получить чек, как
if(eq[i].size() == 1 amp;amp; std::isalpha(eq[i][0])) {
eq[i] = "0";
}
Подойдет ли это для вашего дела?
РЕДАКТИРОВАТЬ: В случае, если у вас есть что-то вроде eq[3] = "abc";
, т. е. целые строки, а не только отдельные буквы, тогда можно было бы сделать что-то подобное:
if(
std::any_of(eq[i].cbegin(), eq[i].cend(), [](char c) {
return std::isalpha(c);
})
) {
eq[i] = "0";
}
Вот документация для std::any_of
Комментарии:
1. Я совершенно не знал об исальфе(). Это работает с кодом, который я использую, спасибо за ваш вклад
Ответ №2:
Во-первых, как уведомил @Peter, eq
имеет нулевой размер при создании и назначении eq[0]
eq[1]
, и eq[2]
, вызывает неопределенное поведение. Это можно решить с помощью std::push_back()
.
Во-вторых, как упоминал @Jerry Jeremiah, isdigit()
проверьте, является ли символ десятичной цифрой , поэтому я не вижу смысла использовать это с stof()
, которое преобразует строку в плавающую.
Это код, который я изменил с вашего:
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int main()
{
vector <string> eq;
//sample data
eq.push_back("a");
eq.push_back("3.5");
eq.push_back("7.5");
eq.push_back("5");
eq.push_back("xyz");
for (int i = 0; i < eq.size(); i )
{
try
{
stof(eq[i]);
}
catch (exception e)
{
eq[i] = "0";
}
cout << "eq[" << i << "]" << " = " << eq[i] << endl;
}
}
Результат:
eq[0] = 0
eq[1] = 3.5
eq[2] = 7.5
eq[3] = 5
eq[4] = 0
Кроме того, было бы более практично использовать второй параметр stof()
(как отметил @Jerry Jeremiah) и использовать if
оператор вместо try-catch
(как отметил @Peter).
*Примечание: Работает на коде::Блоки 20.03, g 6.3.0, Windows 10, 64-разрядная версия.
*Дополнительная информация:
stof()
: https://www.cplusplus.com/reference/string/stof/
std::push_back()
: https://www.cplusplus.com/reference/vector/vector/push_back/
isdigit()
: https://www.cplusplus.com/reference/cctype/isdigit/
Комментарии:
1. Это решение дало желаемый результат спасибо за ваш вклад и дальнейшее чтение