2009-03-06 4 views
2

getopt_long을 사용하여 C++ 응용 프로그램에서 명령 줄 인수를 처리하고 있습니다. 예제는 처리 예에서 모두 printf("Username: %s\n", optarg)과 같은 것을 보여줍니다. 이것은 예제를 보여주는 데는 좋지만 나중에 사용할 값을 실제로 저장할 수 있기를 원합니다. 코드 나머지 부분의 대부분은 char* 대신에 string 개체를 사용하므로 optarg의 내용을 문자열로 캐스팅/복사 /해야합니다.optarg를 C++ 문자열 객체로 가져 오기

string bar; 
while(1) { 
    c = getopt_long (argc, argv, "s:U:", long_options, &option_index); 
    if (c == -1) break; 
    switch(c) 
     { 
      case 'U': 
       // What do I need to do here to get 
       // the value of optarg into the string 
       // object bar? 
       bar.assign(optarg); 
       break; 
     } 
} 

위의 코드는 컴파일하지만 그것이 내가의 printf를 사용하여 바의 값을 인쇄하려고하면 내가 Illegal instruction 오류가 실행할 때 (cout을 위해 잘 작동하는 것 같다).

// Runs just fine, although I'm not certain it is actually safe! 
cout << " bar: " << bar << "\n"; 

// 'Illegal instruction' 
printf(" bar: %s\n", bar); 

불법적 인 명령이 무엇인지 파악하기 위해 명령 줄 디버깅에 대해 충분히 알지 못합니다. 나는 valgrind를 실행하고 있었지만이 오류로 인해 발생하는 엄청난 양의 메모리 오류로 인해이 오류의 원인을 정확히 찾아 낼 수 없었습니다.

답변

7

당신은 % s를 지정할 때 C 스타일 문자열 (null로 끝나는 문자 배열)을 제공했지만, 대신 문자열 클래스를 제공했다고 말씀하셨습니다. 가정 당신은 표준 : : 문자열 시도를 사용하고 있습니다 :

printf("bar : %s\n", bar.c_str()); 
6

printf()는 C++ string의를 처리 할 수 ​​없습니다. 대신 bar.c_str()을 사용하십시오.

+0

나는 이것을 기억해야 할 중요한 목록에 넣어야 할 것 같습니다. 감사! –

3
cout << " bar: " << bar << "\n"; 

은 완벽하게 안전합니다. 왜 그렇게 생각하지 않을까요?

+0

가끔은 단지 그것이 실행된다는 것이 안전하다는 것을 의미하지 않는다는 것을 깨닫기 때문입니다. :) 특히 다른 객체가 같은 객체를 사용할 때 죽는 것처럼 보인다면. –

관련 문제