문제

그래서 저는 현재 C ++를 배우고 있으며 지금까지 배운 기술을 테스트하는 프로그램을 만들기로 결정했습니다. 이제 내 코드에서 사용자가 입력하는 값이 더블인지 확인하고 싶습니다. 두 배가 아닌 경우 IF 루프를 넣고 다시 방문하도록 요청합니다. 내가 가진 문제는 사용자가 어떤 변수 유형을 입력하는지, Ex- 사용자가 char 또는 문자열을 입력하면 오류 메시지를 출력 할 수 있습니다. 내 코드는 다음과 같습니다.

//cubes a user entered number
#include <iostream>
using namespace std;

double cube(double n); //function prototype

int main()
{
    cout << "Enter the number you want to cube: "; //ask user to input number
    double user;
    cin >> user;  //user entering the number

    cout << "The cube of " << user << " is " << cube(user) << "." << endl; //displaying the cubed number

    return 0;
}

double cube (double n) //function that cubes the number
{
    return n*n*n; // cubing the number and returning it
}

편집 : 방금 시작했고 코드에 대한 단서가 거의 없다고 말해야하지만 링크를 확인하겠습니다. 그건 그렇고, 나는 아직 템플릿으로 작업하는 방법을 배우지 못했습니다. 나는 C ++ 프라이머 Plus 5th Edition의 3 장만 데이터를 다루는 것에 대해 배우고 있습니다.

도움이 되었습니까?

해결책

문자열이 있는지 확인하는 적절한 방법이 없습니다. 진짜 표준 라이브러리 내에 더블이 포함되어 있습니다. 당신은 아마 사용하고 싶을 것입니다 후원. 다음 솔루션은 레시피 3.3 인치에서 영감을 얻었습니다 C ++ 요리 책:

#include <iostream>
#include <boost/lexical_cast.hpp>
using namespace std;
using namespace boost;

double cube(double n);

int main()
{
    while(true)
    {
        cout << "Enter the number you want to cube: ";
        string user;
        cin >> user;

        try
        {
            // The following instruction tries to parse a double from the 'user' string.
            // If the parsing fails, it raises an exception of type bad_lexical_cast.
            // If an exception is raised within a try{ } block, the execution proceeds
            // with one of the following catch() blocks
            double d = lexical_cast <double> (user);   

            cout << "The cube of " << d << " is " << cube(d) << "." << endl;
            break;
        }
        catch(bad_lexical_cast &e)
        {
            // This code is executed if the lexical_cast raised an exception; We
            // put an error message and continue with the loop
            cout << "The inserted string was not a valid double!" << endl;
        }
    }
    return 0;
}

double cube (double n)
{
    return n*n*n;
}

다른 팁

안전한 C ++ 방법

이 사용에 대한 함수를 정의 할 수 있습니다 std::istringstream:

#include <sstream>  

bool is_double(std::string const& str) {
    std::istringstream ss(str);

    // always keep the scope of variables as close as possible. we see
    // 'd' only within the following block.
    {
        double d;
        ss >> d;
    }

    /* eat up trailing whitespace if there was a double read, and ensure
     * there is no character left. the eof bit is set in the case that
     * `std::ws` tried to read beyond the stream. */
    return (ss && (ss >> std::ws).eof());
}

그것이 무엇을하는지 알아내는 데 도움을주기 위해 (일부 포인트가 단순화 됨) :

  • 주어진 문자열로 초기화 된 입력 스트링 스트림 생성
  • 사용하여 이중 값을 읽습니다 operator>>. 이것은 공백을 건너 뛰고 두 배를 읽는 것을 의미합니다.
  • 이중을 읽을 수없는 경우 abc 스트림이 설정됩니다 불합격-조금. 사례는 좋아합니다 3abc 성공할 것입니다 ~ 아니다 실패를 설정하십시오.
  • 실패가 설정된 경우 ss 값이 0으로 평가됩니다 거짓.
  • 더블을 읽으면 후행 공백을 건너 뜁니다. 우리가 스트림의 끝에 있다면 ( eof() 돌아올 것입니다 진실 우리가 끝을 지나서 읽으려고한다면. std::ws 정확히),), eof 진실을 돌려 줄 것입니다. 이 점검은 확인하십시오 3abc 수표를 통과하지 않습니다.
  • 두 경우 모두, 오른쪽과 왼쪽 인 경우 && 평가하십시오 진실, 우리는 발신자에게 true로 돌아와서 주어진 문자열이 더블임을 나타냅니다.

마찬가지로, 당신은 확인합니다 int 그리고 다른 유형. 템플릿으로 작업하는 방법을 알고 있다면 다른 유형의 일반화 방법을 알고 있습니다. 덧붙여서, 이것은 정확히 무엇입니다 boost::lexical_cast 당신에게 제공합니다. 확인 해봐: http://www.boost.org/doc/libs/1_37_0/libs/conversion/lexical_cast.htm.

C 길 하나

이 방법은 장점 (빠르기)이지만 주요 단점도 있습니다 (템플릿을 사용하여 일반화 할 수없고 원시 포인터로 작업해야합니다).

#include <cstdlib>
#include <cctype>  

bool is_double(std::string const& s) {
    char * endptr;
    std::strtod(s.c_str(), &endptr);
    if(endptr != s.c_str()) // skip trailing whitespace
        while(std::isspace(*endptr)) endptr++;
    return (endptr != s.c_str() && *endptr == '\0');
}

strtod 설정됩니다 endptr 마지막 캐릭터에게 처리되었습니다. 우리의 경우 종료 널 문자입니다. 변환이 수행되지 않으면 endptr이 주어진 문자열 값으로 설정됩니다. strtod.

C 웨이 2

그럴 수도 있습니다 std::sscanf 트릭을 수행합니다. 그러나 무언가를 감독하는 것은 쉽습니다. 올바른 방법은 다음과 같습니다.

#include <cstdio>

bool is_double(std::string const& s) {
    int n;
    double d;
    return (std::sscanf(s.c_str(), "%lf %n", &d, &n) >= 1 && 
            n == static_cast<int>(s.size()));
}

std::sscanf 변환 된 항목을 반환합니다. 표준은이를 지정하지만 %n 그 수에 포함되지 않으며 여러 출처가 서로 모순됩니다. 비교하는 것이 가장 좋습니다 >= 올바르게 얻으려면 (인력을 참조하십시오 sscanf). n 처리 된 문자의 양으로 설정됩니다. 문자열의 크기와 비교됩니다. 두 형식 지정자 사이의 공간은 선택적 후행 공백을 설명합니다.

결론

초보자라면 읽으십시오 std::stringstream 그리고 C ++ 방식으로하십시오. C ++의 일반적인 개념에 기분이 좋을 때까지 포인터를 엉망으로 만들지 마십시오.

SSCANF 당신이 원하는 것을 할 수 있습니다. 제대로 처리 된 인수 수를 반환합니다. 이것은 당신이 시작해야합니다 :

//cubes a user entered number
#include <iostream>
#include <cstdio>
using namespace std;

double cube(double n); //function prototype

int main()
{
        cout << "Enter the number you want to cube: "; //ask user to input number
        string user;
        cin >> user;  //user entering the number

        // Convert the number to a double.
        double value;
        if(sscanf(user.c_str(), "%lf", &value) != 1)
        {
                cout << "Bad!  " << user << " isn't a number!" << endl;
                return 1;
        }

        cout << "The cube of " << user << " is " << cube(user) << "." << endl; //displaying the cubed number

        return 0;
}

double cube (double n) //function that cubes the number
{
        return n*n*n; // cubing the number and returning it
}

다른 답변에 게시 된 다른 방법에는 장점과 단점이 있습니다. 이것은 후행 문자에 문제가 있으며 "C ++"-y가 아닙니다.

방금 시작했고 코드에 대한 단서가 조금 없다고 말해야하지만 링크를 확인하겠습니다. 그건 그렇고, 나는 아직 템플릿으로 작업하는 방법을 배우지 못했습니다. 나는 C ++ 프라이머 Plus 5th Edition의 3 장만 데이터를 다루는 것에 대해 배우고 있습니다.

C에 떨어지고 사용할 수 있습니다 strtod

프로그램은 문자열로 읽은 다음 문자열을 이중으로 변환하려는 함수로 전달합니다.

bool is_double(const char* strIn, double& dblOut) {
    char* lastConvert = NULL;
    double d = strtod(strIn, &lastConvert);
    if(lastConvert == strIn){
        return false;
    } else {
       dblOut = d;
       return true;
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top