문제

임베디드 시스템에 약간의 입력을 구문 분석하려고합니다. 나는 다음과 같은 것을 기대하고있다 :

SET VARNAME=1,2,3,4,5,6,7,8,9,10\0

별도의 문자열을 ints로 변환 할 때 둘 다 atoi() 그리고 strtol() 문자열이 8로 시작하면 0을 반환하는 것 같습니다.

내 코드는 다음과 같습니다.

char *pch, *name, *vars;
signed long value[256];
int i;

#ifdef UARTDEBUG
    char convert[100];
#endif
if(strncmp(inBuffer, "SET",3)==0)
{
    pch = strtok(inBuffer," ");
    pch = strtok(NULL," ");
    name = strtok(pch, "=");
    vars = strtok(NULL,"=");

    pch = strtok(vars,",");

    i = 0;
    while(pch != NULL)
    {
        value[i] = atoi(pch);
        #ifdef UARTDEBUG
            snprintf(convert, sizeof(convert), "Long:%d=String:\0", value[i]);
            strncat(convert, pch, 10);
            SendLine(convert);
        #endif
        i++;
        pch = strtok(NULL,",");

        // Check for overflow
        if(i > sizeof(value)-1)
        {
            return;
        }
    }    

    SetVariable(name, value, i);
}

통과 :

SET VAR=1,2,3,4,5,6,7,8,9,10\0

내 UART 디버그에서 다음을 제공합니다.

Long:1=String:1                                                                
Long:2=String:2                                                                
Long:3=String:3                                                                
Long:4=String:4                                                                
Long:5=String:5                                                                
Long:6=String:6                                                                
Long:7=String:7                                                                
Long:0=String:8                                                                
Long:9=String:9                                                                
Long:10=String:10

업데이트:

나는 'value [i] = atoi (pch);'전후에 인버퍼를 점검했다. 그리고 그것은 동일하고 올바른 지점으로 나뉘어져있는 것으로 보입니다.

S  E  T     V  A  R     1     2     3     4     5     6     7     8     9  ,  1  0
53 45 54 00 56 41 52 00 31 00 32 00 33 00 34 00 35 00 36 00 37 00 38 00 39 2c 31 30 00 00 00 00 

UPDATE 2:

내 UARTDEBUG 섹션은 현재 읽습니다.

        #ifdef UARTDEBUG
            snprintf(convert, 20, "Long:%ld=String:%s", value[i], pch);
            SendLine(convert);
        #endif

내가 댓글을 달면 snprintf() 라인, 모든 것이 완벽하게 작동합니다. 그래서 무슨 일이 일어나고 있습니까?

도움이 되었습니까?

해결책

자신의 글을 쓰려고 할 수 없습니다 atoi? 길이가 10 줄과 같으면 쉽게 디버깅 할 수 있습니다 (문제가 실제로 어디에 있는지 확인하십시오).

  • '0' = 0x30
  • '1' = 0x31

그래서, 당신은

string[x] - 0x30 * pow(10, n)

당신은 각 숫자에 대해

다른 팁

관련이 없지만

if(i > sizeof(value)-1)
                {
                        return;
                }

해야한다

if(i == sizeof(value)/sizeof(value[0]) )
                {
                        return;
                }

다른 코드 조각이 잘못된 방식으로 오버플로 점검을하는 경우 문제의 원인 일 수 있습니다.

방금 내 시스템에서 샘플 코드를 컴파일하고 실행하려고 시도했습니다. 출력이 정확합니다 (예 : 출력 문자열에 있어야하는 곳에 나타납니다)는 다른 일이 우리에게 제공 한 코드의 범위 밖에서 진행되고 있음을 나타냅니다.

나는 사지로 나가서 변수 나 함수 중 하나가 입력 문자열이나 다른 변수 또는 배열을 짓밟고 있다고 말할 것입니다. Sendline과 SetVariable은 볼 장소입니다.

그러나 더 중요한 것은 당신은 우리에게 당신의 문제를 해결하는 데 도움이되는 도구를주지 않았습니다.. 사람들에게 프로그램 디버깅을 도와달라고 요청할 때 문제를 보여주는 전체 소스로 간단한 테스트 케이스를 제공합니다.. 그렇지 않으면, 우리는 문제가 무엇인지 추측해야합니다. 이것은 우리에게 실망스럽고 비생산적입니다.

Atoi는 숫자로 렌더링 할 수없는 것에 대해 0을 반환합니다. 이것은 단지 직감 일뿐입니다. 그러나 문자열의 이진 표현을 덤핑하려고 시도 했습니까 (또는 문자열 길이가 일치하는지 확인)?

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