2012-09-03 3 views
1

저는 MATLAB로 작성된 코드를 C로 포팅하려고합니다. 그래서 함수를 컴파일하고 더 빠르게 실행할 수 있습니다 (코드가 자주 실행되고 속도가 상당히 빨라집니다).sprintf를 사용하여 특정 위치에서 C의 char 배열에 쓰는 방법은 무엇입니까?

기본적으로 MATLAB 코드는 매트릭스를 사용하여 대괄호와 쉼표를 추가하여 문자열로 변환하므로 텍스트 파일에 쓸 수 있습니다.

이제
MyVec = rand(1,5); 
NbVal = length(MyVec) 
VarValueAsText = blanks(2 + NbVal*30 + (NbVal-1)); 
VarValueAsText([1 end]) = '[]'; 
VarValueAsText(1 + 31*(1:NbVal-1)) = ','; 
for i = 1:NbVal 
    VarValueAsText(1+(i-1)*31+(1:30)) = sprintf('%30.15f', MyVec(i)); 
end 

, 어떻게 C에서 비슷한 결과를 얻을 수 있습니다 : 다음은이 벡터 MyVec을 위해 어떻게 작동하는지의 아이디어인가? 내가 문자열 (char 배열)의 크기를 미리 계산할 수 있고 기억 영역에 쓸 각 요소의 위치를 ​​알고 있기 때문에 너무 어려워 보이지 않습니다. 또한 sprintf 함수가 C에 있습니다. 그러나 이것을 설정하는 방법을 이해하는 데 어려움이 있습니다. 시행 착오를 통해 쉽게 배울 수있는 환경이 없기 때문입니다 (재 컴파일해야 할 때마다 세분화 오류 및 MATLAB 충돌 ...).

+0

일부 샘플 입력 (예 : 4 * 4 매트릭스)을 표시하면 상황이 더 쉬울 수 있습니다. (디스크상의 파일을 중간 저장 공간으로 사용 하시겠습니까? 아니면 메모리 내 인터페이스를 원하십니까?) 참고 : C에서 sprintf()는 첫 번째 인수로 문자열/버퍼를 가져야합니다. 이 부분에서 matlab이 매우 다른 것을 기대하지 마십시오. 주 2 : 결과 문자열에 구분 기호 (공백, 탭, 쉼표, 줄 바꿈)가없는 것 같습니다. – wildplasser

+0

안녕하세요 & 답장을 보내 주셔서 감사합니다. 나는 당신의 의견을 이해할 수 있는지 모르겠다 : 넣어 코드를 내가 C로 포트에 노력하고있어 MATLAB 현재 (작업) 코드입니다. 사실, 첫 번째 줄을 추가했습니다. 임의의 입력)를 샘플 입력으로 사용합니다. 결국 VarValuesAsString에서 "형식화 된 값"을 얻습니다. – Federico

+0

mathlab에 대해 아무것도 모릅니다. 결과 문자열이'[val1, val2, val3, ...]'이 되길 원하는 것처럼 보이지만 이것이 맞습니까? – wildplasser

답변

4

sprintf은 인쇄 할 문자열의 끝에 문자열 종결자를 넣습니다. 따라서 "인쇄"할 문자열이 인쇄 할 문자열보다 길면 작동하지 않습니다.

문자열의 일부만 덮어 쓰려면 임시 버퍼에 sprintf을 사용하고 memcpy을 사용하여 실제 문자열에 해당 버퍼를 복사해야합니다. 다음과 같이 입력하십시오.

char temp[32]; 
sprintf(temp, "...", ...); 

memcpy(&destination[position], temp, strlen(temp)); 
+0

통찰력을 가져 주셔서 대단히 감사합니다! 성공적으로 최종 변수의 올바른 위치에 변수를 작성했지만 출력 문자열은 첫 번째 요소로 제한되었습니다. 대답의 핵심은 실제로 문자열 종료자를 포함하지 않았습니다 !!! – Federico

4

감안할 때 ...

나는 누군가가 문제가 아마 사소한 것처럼 보일지라도 도울 수 있기를 바랍니다,하지만 난 C와 매우 작은 경험을하고 난에서 시작하는 적절한 예를 찾을 수 없어 루프는 다음과 같이 보일 수 있습니다,

char *ptr = &string[offset]; 

당신이 그들을 인쇄 할 행렬의 라인을 통해 반복하는 경우 : 오프셋이 포인터는 단순히 이루어집니다 검색 문자열로 (바이트) 오프셋

char *ptr = output_buffer; 
for (i = 0; i < n_lines; i++) { 
    sprintf (ptr, "...", ...); 
    ptr = &ptr[line_length]; 
} 

출력 버퍼에 충분한 메모리를 할당했는지 확인하십시오.

+0

sprintf와 snprintf가 성공하면 문자열에 기록 된 문자 수를 반환합니다. 이 반환 값을 사용하여 오프셋을 계산할 수도 있습니다. char * ptr = output_buffer; positionToWrite + = sprintf (positionToWrite, "...", ...); – LucianNovo

관련 문제