2013-08-09 3 views
1

C++에서 암호화/암호 해독 프로그램을 만들고 암호화를 사용자 지정하기 위해 사용자 제공 번호 세 개를 사용합니다. 그 기반으로 기능을 cplusplus.com에 isdigit에()에 대해 읽고, 제작 :C++ 인수가 숫자 인 경우 참조

bool is_numeric(char *string) 
{ 
    int sizeOfString = sizeof(string); 
    int iteration = 0; 
    bool isNumeric = true; 

    while(iteration < sizeOfString) 
    { 
     if(!isdigit(string[iteration])) 
     { 
      isNumeric = false; 
      break; 
     } 

     iteration++; 

    } 

    return isNumeric; 
} 

그러나, 작동하지 않습니다. 숫자 나 숫자가 아닌 문자를 사용하더라도 여전히 false를 반환합니다. 내 접근 방식에 문제가있다.

+1

문자열 문자열을 호출하는 것은 약간 위험합니다. std를 사용하면 특히 네임 스페이스 표준을 사용하는 경우 몇 가지 문제가 발생할 수 있습니다. –

+5

'use namespace std'를 사용하지 않습니다. 나는 항상'std :: whatever'을 사용합니다. 이것은 일을하는 올바른 방법 인 것 같습니다. – Igor

+0

sizeof는 호출 된 유형의 컴파일 시간 크기를 반환합니다. 문자열 변수는'char *'타입을 가지므로'char *'변수의 크기를 얻게됩니다. C 배열의 경우 배열의 유형도 해당 크기입니다. E.G. 'int foo [100]'의 타입은 100 개의 int 배열입니다. 이 배열들이 많은 상황에서 포인터에 조용히 쇠퇴하는 곳이 있음을 주목하십시오. http://ideone.com/gYqUiY가 유용 할 수 있습니다. – Lalaland

답변

3

sizeOfString이 잘못 계산 중입니다. 대신이 방법을 사용해보십시오.

bool is_numeric(char *string) 
{ 
    int sizeOfString = strlen(string); 
    int iteration = 0; 
    bool isNumeric = true; 

    while(iteration < sizeOfString) 
    { 
     if(!isdigit(string[iteration])) 
     { 
      isNumeric = false; 
      break; 
     } 

     iteration++; 

    } 

    return isNumeric; 
} 

. 문자를 확인하는 기능을 추가 할 수 있습니다! 문자열이 정수인 경우 코드가 true를 반환합니다. 이 약자로 문자열이 음수로 밖으로 작동 아무것도 포함되어있는 경우, 코드는 (종종 않습니다) (동작을 정의되지 않은 수

bool is_numeric(char const *string) 
{ 
    return std::all_of(string, string+strlen(string), 
         [](unsigned char c) { return ::isdigit(c); }); 
} 

참고 :

+1

그것은 확실히 그것을 고쳤다. 내 바보 같은 실수를 고쳐 주셔서 감사합니다. – Igor

+0

또한'for'-loop를 사용하여 코드를 읽기 쉽게 만드십시오. 또한 간단한 반복 변수로'i'를 사용합니다 :'for (int i = 0; i JSQuareD

+0

Hmmm ....'is_numeric ("À") ; -> 충돌. –

5

는 내가 표준 알고리즘을 사용 거라고 생각 char로 인코딩 된 경우). 이 코드는 char을 람다에게 전달 된 unsigned char으로 변환하는 것을 막습니다. 그래서 나는 ::isdigit을 단지 all_of에 전달하는 대신 람다를 사용했습니다.

1
while ('0' <= *string && *string <= '9') 
    ++string; 
return *string == '\0'; 

또는, 당신은 isdigit 사용하여 선호하는 경우 다음을 다할 것

bool isNumeric(const string& s) { 
    stringstream ss(s); 
    int val; 
    ss >> val; 
    return ! ss.fail() && ss.eof(); 
} 

이제 stringstream :: 연산자 >> (&를 INT) : 또 다른 가능한 솔루션은 이제 stringstream을 사용

while (is digit((int)*string)) 
    ++string; 
return *string == '\0'; 
+0

당신은 정말로'int'가 아닌'unsigned char'으로 형 변환하고 싶습니다. 'char'에서'int'까지의 승격은 자동적으로 일어나지 만, 음수의 입력은 음수로 남을 것이므로 여전히 정의되지 않은 동작을 얻습니다. –

+0

@JerryCoffin - 너무 성급한. –

1

을 주어진 문자열이 숫자가 아닐 경우 stringstream의 failbit을 설정해야하며, 문자열에있는 모든 문자열이 정확히 하나의 정수가 아닌지 확인해야합니다. eof 비트. 이것은 음수에 대해서도 적용되며 부동 소수점을 허용하려는 경우 int를 double로 변경할 수도 있습니다.

+0

다음과 같은 이유로 인해 작동하지 않습니다. – edW

관련 문제