terminfo의 매개 변수화 된 문자열 구문 분석기에서 %d
인코딩의 동작을 이해하려고합니다. 관련 매뉴얼 페이지 here이며한다고 -terminfo 매개 변수화 된 문자열 % d 인코딩 동작
%[[:]flags][width[.precision]][doxXs]
as in printf, flags are [-+#] and space. Use a ":" to allow the
next character to be a "-" flag, avoiding interpreting "%-" as an
operator.
가 있지만 값이 인쇄되어야하며 가장자리의 경우 무엇을해야 할 곳에서에 대해 아무것도 말하지 않는다. 그들은 스택이나 매개 변수화 된 문자열로 전달되는 인수로부터 왔습니까? 또한 여분의 인수가 전달 된 경우 (매개 변수화 된 문자열에서 %d
과 같지 않음) 또는 여분의 %d
이있는 경우 (매개 변수화 된 문자열이 잘못 되었습니까?) 그 정의되지 않은 동작 또는 구현 정의 또는 정의 어딘가에 정의되어 있습니까?
#include <iostream>
#include <curses.h>
#include <term.h>
using namespace std;
int main() {
// single %d prints single argument
// => 2
auto res = tparm("[%d]", 2);
cout << res << endl;
// single %d prints single argument and ignores additional
// => 2
res = tparm("[%d]", 2, 3, 4);
cout << res << endl;
// multiple %d prints 0 for absent additional arguments
// => 2-0-0-0
res = tparm("[%d-%d-%d-%d]", 2);
cout << res << endl;
// multiple %d prints with equal number of arguments prints
// first two correctly and rest 0
// => 2-3-0-0-0
res = tparm("[%d-%d-%d-%d-%d]", 2,3,4,5,6);
cout << res << endl;
// single value pushed to stack prints from stack
// => 2
res = tparm("[%p1%d]", 2);
cout << res << endl;
// single value pushed to stack prints from stack and ignores extra arguments
// => 2
res = tparm("[%p1%d]", 2,3,4);
cout << res << endl;
// single value pushed to stack prints from stack and additional prints are 0
// if no arguments are provided
// => 2-0-0
res = tparm("[%p1%d-%d-%d]", 2);
cout << res << endl;
// single value pushed to stack prints from stack and additional prints 0
// even if equal arguments are provided
// => 2-0-0
res = tparm("[%p1%d-%d-%d]", 2,3,4);
cout << res << endl;
// single value pushed to stack prints from stack after pop()?
// => 100-<garbage>
res = tparm("[%p1%d-%c]", 100);
cout << res << endl;
// pushed to stack via {} and equal arguments provided, prints all
// => 2-1-100-200
res = tparm("[%{1}%{2}%d-%d-%d-%d]", 100, 200);
cout << res << endl;
// pushed to stack via {} and %p1 equal arguments provided
// prints only stack and rest 0
// => 100-2-1-0
res = tparm("[%{1}%{2}%p1%d-%d-%d-%d]", 100, 200);
cout << res << endl;
}
다음 중 어느 것입니까? C 또는 C++? –
"정의되지 않은 동작"과 "구현 - 정의 된 동작"의 차이점은 무엇입니까? –
@ScottHunter는 두 lang이 모두 tparm()을 사용할 수 있기 때문에 중요하지 않습니다. param의 특정 조합에서 ncurses를 사용하여 세그먼테이션 결함이 발생했기 때문에 정의되지 않은 동작을 작성했습니다.문자열하지만 다른 구현 (같은 다른 언어로 다른 lib)에 똑같은 시도했을 때 그것은 완전히 다른 결과를 줬다. (그러므로 잘못되었거나 구현이 정의 된 동작을하고있다.) –