2016-10-09 2 views
0

저는 pdcurses 라이브러리를 사용하고 있으며 화면의 한 줄을 위로 이동시키는 함수를 작성하고 있습니다. 여기에는 현재 행을 복사 한 다음 위에 붙여 넣습니다. 문제는 전체 줄 인쇄를위한 curses 함수가 printf과 같은 형식 문자열을 사용한다는 것입니다. 이 줄은 백분율 기호를 포함 할 수 있으므로 붙여 넣기를하면 그 기호는 물론 손실됩니다.printf가 서식을 무시하도록합니다.

printw() 함수는 현재 또는 지정된 커서 위치에서 창으로 포맷 된 문자열을 추가합니다. 형식 문자열은 표준 C 라이브러리의 printf()에서 사용 된 것과 동일한 입니다. (printw() 는의 printf()를위한 드롭 인 교체로 사용할 수 있습니다.)

작은 예는 다음과 같습니다

chtype p[200]; 
winchnstr(w, p, 200); //obtain the line 
clrtoeol(); //remove the line 

wmove(w, y-1, x); //move up a line 
clrtoeol(); //erase the line 
wprintw(w, p); //print the new line 

이 비율을 치료하기 위해 printf와 강제로 어떤 방법이 있나요 p을 거치지 않고 모든 기호 사이에 백분율 기호를 삽입하지 않고도 정상적으로 신호를 표시합니까? 그렇게 단순한 것에는 다소 성가신 것 같습니다.

첫 번째 해결 방법은 p을 문자열로 변환하고 문자열을 반복하고 %을 각 % 뒤에 삽입하는 것입니다. 그러나 한 번에 많은 줄을 움직이면 (화면 위쪽으로 움직이는 효과를 만들기 위해 노력하고 있습니다) 성능면에서 최고의 솔루션이 아닐 수도 있습니다.

다른 솔루션 대신 p을 반복 그냥 개별적으로 각 문자를 추가 할 addch()을 사용합니다. 그러나 이것은 성능/효율성이 wprintw과 비교하여 떨어질까요? 또는 wprintw은 단순히 각 캐릭터를 개별적으로 붙여 넣는 영광스러운 버전입니까? 이것들이 정말로 내가 가지고있는 유일한 두 가지 옵션입니까?

답변

2

그대로 당신의 문자열을 받아 printf을 강제하려면, 형식 지정자 %s을 사용하고 문자열을 인수로 전달하십시오. printf 인수는 형식 처리의 대상이 아닙니다. 스트링의 경우, 바이트는 단순히 목적지 버퍼로 복사된다. 길이 인수가 있어야한다는

printf("%*s", 5, "ab%cdefghi"); // prints "ab%cd" 

참고 : 경우

printf("%s", "My string with % signs"); 

은 문자열을 사용하면 %*s 형식 지정자를 사용하는 경우 제로 종료, 당신의 printf 문자열 전에 길이를 통과 할 수없는 유형은 int입니다.

+0

당신 말이 맞아요. 너무 간단한 것을 묻기 위해 약간 어리석은 느낌. 그래도 고마워. – SergeantPenguin

1

당신이 간단하게 변경할 수 없습니다 :

wprintw(w, p); 

대신 할 : 또는

wprintw(w, "%s", p); 

나 :

waddchstr(w, p); 
+0

감사합니다. – SergeantPenguin

2

당신은 addstr() 대신 printw() 사용할 수 있습니다. (printw()은 기본적으로 그냥 형식 문자열을 구문 분석하고 addstr()에 결과를 전달합니다.) 도움을

관련 문제