문제
나는 숯 어레이에서 다항식의 계수를 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가 분석 해야하는 경우, 부스트. .