MFC 파싱함수 관련 질문좀 드리겠습니다 (AfxExtractSubString)

nasescobar1의 이미지

이 함수의 사용법이

AfxExtractSubString('저장할 변수", "파싱할문자열", "파싱할구역", "구분자");

인 것으로 알고 있습니다.

근데 저 같은 경우 Edit Control 박스를 활용해서 이것에 구분자를 하나 입력하고 (,든 /든)

그 구분자에 맞춰서 파싱을 해주려고 하는데요

저 구분자를 삽입해야하는 인자 항목에 변수를 집어넣을 수는 없는건가요?

m_InputSymbol.GetWindowText(nInputSymbol);

이와 같이 구분자를 저장받아

AfxExtractSubString(nOutputText, nInputText, 0, nInputSymbol);

이렇게 사용하려고 했더니,

error C2664: 'AfxExtractSubString' : 매개 변수 4을(를) 'CString'에서 'TCHAR'(으)로 변환할 수 없습니다.

라는 오류가 발생하기에 질문드립니다.

type의 이미지

Quote:
매개 변수 4을(를) 'CString'에서 'TCHAR'(으)로 변환할 수 없습니다.

=> 매개 변수 4에는 'TCHAR' 타입이 들어와야 하는데 'CString' 타입이 들어왔습니다.

결론부터 말씀드리면, 변수도 넣을 수 있습니다. 타입만 맞는다면요.

https://msdn.microsoft.com/ko-kr/library/aa991543.aspx

BOOL AFXAPI AfxExtractSubString (
   CString& rString,
   LPCTSTR lpszFullString,
   int iSubString,
   TCHAR chSep = '\n' // <= 여기!
);

즉 구분자로는 CString 타입의 문자열이 아니라 TCHAR 타입의 문자 하나가 들어와야 한다는 거죠.

TCHAR이 char이냐 wchar_t이냐 하는 골치아픈 문제는 요즘에는 별로 신경 안 써도 된다면, 아마 그냥 대충 이렇게만 해도 될 겁니다.

AfxExtractSubString(nOutputText, nInputText, 0, nInputSymbol[0]);

아 물론, nInputSymbol는 한 글자짜리 문자열이어야 합니다.

nasescobar1의 이미지

친절한 답변 감사드립니다! 배열 0번인덱스를 주는 방법도 좋지만~ 혹시나 2개 이상의 구분자가 입력되는 경우를 대비해서 TCHAR과 CString을 변환하면서 하면 어떨까 싶어

TCHAR tInputSymbol = (TCHAR)(LPCTSTR)nInputSymbol;

이런 식으로 변환해서 인자로 줘봤는데 되지는 않는군요.. ㅠㅠ

fat chance의 이미지

AfxExtractSubString함수는 구분자로 문자 하나(TCHAR)를 받습니다. 구분자 하나에 대해서만 동작하는 알고리즘이 구현되어 있을 것입니다. 캐스팅 같은 억지스러운 수단을 동원한다고 해도 그 사실이 바뀌지는 않습니다.

사람을 상대할 때는 (귀하가 갑이라면) 억지스러운 요구를 해도 최대한 맞춰 줄지도 모르지만, 컴퓨터에게는 (아직은) 그런 걸 기대할 수 없지요.

TCHAR tInputSymbol = (TCHAR)(LPCTSTR)nInputSymbol;와 같은 캐스팅이라니, 각 타입들이 정확히 어떤 것인지 이해하고 계신다면 이런 끔찍하고 무시무시한 발상을 하시기는 어려우셨을 텐데요.

타입 캐스팅은 위험한 도구입니다. 게다가 컴파일러는 프로그래머가 이 도구를 잘 이해하고 적절히 사용했으리라는 가정을 하기 때문에, 정말로 컴파일할 수 없는 경우를 제외하면 아무리 넌센스더라도 좀처럼 경고 하나 해 주지 않습니다.

그러니 본인이 무엇을 하려는지 정확하게 파악할 수 있는 상황이 아니라면, 타입 캐스팅의 이용은 가능한 한 지양하시는 게 좋겠다는 말씀을 드리고 싶네요.

nasescobar1_의 이미지

제가 몰라서 그렇게 형변환을 했다고 생각하세요??

구분자가 하나 이외에 둘 이상 입력될 경우 오류가 발생할 수 있어 예외처리 한 겁니다.

묻는 말에나 대답하지 도대체 얼마나 잘나셨길래 사람을 그렇게 무안주고 가르쳐드려는지

참..ㅋㅋㅋ 경력이 높을수록, 실력이 뛰어날수록 겸손해야한다는 사실은 잘 모르시는 것 같네요

남을 가르쳐들지 말고 자신 스스로 개발 역량이 부족하진 않은지 생각해보시길 바랍니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.