Используя isdigit (), чтобы определить, является ли индекс вектора буквой или цифрой

#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 возвращает a double . Как 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. Это решение дало желаемый результат спасибо за ваш вклад и дальнейшее чтение