문제

나는 숯 어레이에서 다항식의 계수를 int 배열에 넣으려고 노력하고 있습니다.
나는 이것을 가지고있다:

char string[] = "-4x^0 + x^1 + 4x^3 - 3x^4";

그리고 공간으로 그것을 토큰화할 수 있습니다
-4x^0
x^1
4x^3
3x^4

그래서 나는 int 배열에 -4, 1, 4, 3을 얻으려고 노력하고있다

 int *coefficient;
 coefficient = new int[counter];

 p = strtok(copy, "  +");
 int a;
 while (p)
 {
  int z = 0;
  while (p[z] != 'x')
   z++;
  char temp[z];
  strncpy(temp[z], p, z);
  coefficient[a] = atoi(temp);
  p = strtok(NULL, "  +");
  a++;
 }

그러나 char*를 strncpy (temp [z], p, z)로 숯으로 변환 할 수 없다는 오류가 발생합니다.

error: invalid conversion from ‘char’ to ‘char*’  
error: initializing argument 1 of ‘char* strncpy(char*, const char*, size_t)’

이것을하는 가장 좋은 방법은 무엇입니까?

도움이 되었습니까?

해결책

이것:

strncpy(temp[z], p, z);

될 필요가있다:

strncpy(temp, p, z);

그러나 그것을 기억하십시오 strncpy 항상 문자열을 종료하지는 않습니다.

또한, z 계수의 길이는 있지만 널 터미네이터의 버퍼에 여분의 바이트가 필요합니다.

업데이트:

귀하의 링크를 검토하면 여전히 몇 가지 심각한 문제가 있습니다.

  • "-"in을 사용할 수 없습니다 strtok "-4x"와 원하는 것을 선택할 수 있기 때문입니다. 나는 당신이 공간에서만 분할하고 +/- 연산자를 토큰으로 처리해야한다고 생각합니다.
  • 그만큼 strncpy 함수는 문자열을 문자열을 끝내지 않게합니다 atoi 충돌하거나 잘못된 값을 무작위로 제공합니다. 관용적 인 형태 중 하나는 터미네이터를 수동으로 작성하는 것입니다 (예 : temp[z] = '\0'.
  • 출력 값을 얻지 못하는 이유는 coefficient[a] = 무작위 메모리에 글을 쓰고 있습니다 a 비 초기화됩니다.

다른 팁

당신은 지나가고 있습니다 char 에게 strncpy:

  strncpy(temp[z], p, z);

첫 번째 주장은 a char* 포인터, 싱글이 아닙니다 char. 아마도 당신이 의미하는 것은 다음과 같습니다.

  strncpy(temp, p, z);

다른 사람은 strncpy () ''ing 'on to tomp [z]에 대해 정확합니다.

무료 변수의 지수를 캡처하고 싶다고 제안하겠습니다. 나는 당신이 소홀히하는 것처럼 보이는 암시 적 "0x^2"용어를 관찰합니다. 다음 단계가 x의 다양한 값에 대해 다항식을 평가하는 것이라면 (또는 더 나쁘게 솔버를 실행) 그러한 힘을 알아야합니다.

이런 종류의 솔루션은 쉽게 만들 수 있지만 여분의 공백, 공백이없고 여러 운영자와 가변 이름을 처리 할 수있을 정도로 광범위하게 증명할 수 있습니다. 이러한 종류의 전략은 점점 더 복잡하고 어려워집니다 (특히 의미있는 오류가 필요한 경우 구문 분석이 실패한 경우 메시지).

Boost.Regex (또는 Boost.spirit가 분석 해야하는 경우, 부스트. .

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