문제

(제 생각에는) 흥미로운 질문을 제시하는 코드가 있습니다.

/*power.c raises numbers to integer powers*/
#include <stdio.h>

double power(double n, int p);

int main(void)
{
    double x, xpow; /*x is the orginal number and xpow is the result*/
    int exp;/*exp is the exponent that x is being raised to */

    printf("Enter a number and the positive integer power to which\n the first number will be raised.\n enter q to quit\n");

    while(scanf("%lf %d", &x, &exp) ==2)
    {
        xpow = power(x, exp);
        printf("%.3g to the power %d is %.5g\n", x, exp, xpow);
        printf("enter the next pair of numbers or q to quit.\n");
    }

    printf("Hope you enjoyed your power trip -- bye!\n");
    return 0;
}

double power(double n, int p)
{
    double pow = 1;
    int i;

    for(i = 1; i <= p; i++)
    {
        pow *= n;
    }
    return pow;
}

입력할 숫자의 순서는 부동 소수점 숫자, 그 다음 10진수(기본 숫자, 그 다음 지수)입니다.하지만 정수 밑과 부동 소수점 지수를 입력하면 이상한 결과가 나옵니다.

[mike@mike ~/code/powerCode]$ ./power
Enter a number and the positive integer power to which
 the first number will be raised.
 enter q to quit
1 2.3
1 to the power 2 is 1
enter the next pair of numbers or q to quit.
2 3.4
0.3 to the power 2 is 0.09
enter the next pair of numbers or q to quit.

부동 소수점 지수의 두 번째 숫자를 다음 입력으로 다시 밀어넣는 것 같습니다.나는 누군가가 뒤에서 무슨 일이 일어나고 있는지 설명할 수 있기를 바랐습니다.나는 이것이 배열 경계를 확인하지 않는 scanf()의 작업이라는 것을 알고 있지만 누군가 나에게 더 깊은 이해를 줄 수 있다면 정말 감사하겠습니다.스택 오버플로 감사합니다.-미.

편집하다.의견을 보내주신 모든 분들께 감사드리고 싶었습니다.다른 답변을 환영합니다.다시 한번 감사드립니다, S.O.

도움이 되었습니까?

해결책

첫 번째 "2.3"Scanf를 읽을 때 "" "를 읽습니다." 그것이 더 이상 유효한 정수가 아니라는 것을 알고 있습니다. 따라서 ".3"은 버퍼에 남겨져 있으면 "2 3.4"so "를 입력합니다 .3 n2 3.4"는 버퍼에 있습니다. Scanf는 예제가 보여준 것처럼 ".3"및 "2"가 얻는다는 것을 파서 묶을 때.

다른 팁

Scanf를 사용하여 "2.3"을 읽을 때 스캔이 중단되지만 ""소비하지 않기 때문입니다. ".3"에서. 따라서 다음에 Scanf를 호출 할 때 ".3"에서 읽는 것으로 시작합니다.

자세히 설명하기 위해 Scanf 호출은 한 줄의 텍스트로 제한되지 않습니다. scanf ()는 탭, 공백 및 신생을 포함하여 공백을 건너 뜁니다.

다른 사람들이 귀하의 특정 질문에 답변했지만 한 가지 조언을 제공하고 싶습니다. 절대 사용 scanf() 또는 fscanf().항상.진지하게.

동안 실패 [f]scanf() 작업을 수행하면 항상 파일 포인터가 불확실한 위치에 남게 됩니다.사용자의 대부분의 입력은 일반적으로 행(GUI 제외)을 기반으로 하기 때문에 다음을 사용하는 옵션이 있습니다. fgets() 그리고 sscanf() 제 생각에는 항상 더 좋습니다.

입력 포인터를 알려진 지점(다음 줄의 시작)에 두는 장점이 있습니다. 그리고 방금 읽은 줄을 명령에 의해 지시된 것뿐만 아니라 다양한 방법으로 조작할 수 있습니다. scanf() 가족.

즉, 만약 sscanf() 실패하더라도 해당 행을 다른 목적으로 사용할 수 있습니다(다른 형식 문자열로 다시 스캔하거나 단순히 오류와 함께 출력할 수도 있음). stdio 파일의 줄 시작 부분으로 돌아가는 체조(파일로는 하드, 터미널에서는 stdin으로는 불가능).

C에서 Scanf ()는 기본적으로 인간 사용자의 실제 입력에 대해 쓸모가 없습니다. 데이터 파일에서 고정 형식 텍스트를 읽기위한 것입니다. C ++를 사용하는 경우 ioStream 입력을 사용해야하며, 어느 경우 모두 특정 입력 요구 사항에 대해 자신의 구문 분석 루틴을 작성해야합니다.

나는 라인을 읽고 각 줄을 구문 분석하기 위해 sscanf를 사용합니다. 나는 다른 사람들과 동의합니다.하지만 SSCANF보다 더 나은 방법이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top