ページ 11

%が含まれる文字列を表示しようとするとエラーになる

Posted: 2009年11月14日(土) 22:10
by dic
現在ライブラリを作って、テストしてて発見したのですが
printf() 関数に渡す文字列に % を含む文字列を渡すとランタイムエラーがでます
一文字ずつ printf( "%d" ); で表示するとうまく表示できるのです

サンプルプログラムでは指定した文字列をいったん、全部 char化し、vector<char>に格納して
一個ずつ表示する方法と
printfで一気に表示する方法を試しました

やはりこれも文字コードと関連のあるバグなのでしょうか?
#include	<stdio.h>
#include	<vector>
using namespace std;


int		main()
{
	char	buf[256] =   "---dns.org/%7eupus---";
						//---dns.org/~upuser---

	vector<char>	v;
	int				i;

	for( i=0; i<strlen(buf); i++ )
		v.push_back( buf );

	//	これはうまく表示される
	for( i=0; i<v.size(); i++ )
		printf( "%c", v.at(i) );

	//	ここでランタイムエラー
	printf( buf );

	return 0;
}

Re:%が含まれる文字列を表示しようとするとエラーになる

Posted: 2009年11月14日(土) 22:47
by 御津凪
VC++ だと、 % で指定するフォーマット文字列をチェックするため、指定が正しくないとランタイムエラーが出ます。
(対応する変数が渡されていなくてもエラーになります)

これを回避するには、% を二つ並べるか、 puts などで書式出力を行わないようにするといいと思います。

Re:%が含まれる文字列を表示しようとするとエラーになる

Posted: 2009年11月14日(土) 22:47
by 組木紙織
>現在ライブラリを作って、テストしてて発見したのですが
>printf() 関数に渡す文字列に % を含む文字列を渡すとランタイムエラーがでます

バグというより仕様です。
仕様というより未定義の動作?


printf("%s",buf);
としてみてください。

Re:%が含まれる文字列を表示しようとするとエラーになる

Posted: 2009年11月15日(日) 00:01
by dic
buf[256] = ".......";
if( strstr(buf,..) )
としててランタイムエラーがでたんで
printfでどうなってるか確認してみたわけです

そうですか%は特殊文字ってみなすんですか
今回は%を含む文字列は削除という方法で解決できました

回答ありがとうございました