2016-07-22 6 views
0

私は占いファイルのパーサーを作成しています。 Fortuneは* nixプラットフォーム上の小さなアプリで、ランダムな "運"を表示します。占いファイルはストレートテキストであり、各運勢はそれ自身の行のパーセント記号で区切られています。たとえば:Objective-Cでパーセント記号(%)でファイルを解析する

A little suffering is good for the soul. 
       -- Kirk, "The Corbomite Maneuver", stardate 1514.0 
% 
A man either lives life as it happens to him, meets it head-on and 
licks it, or he turns his back on it and starts to wither away. 
       -- Dr. Boyce, "The Menagerie" ("The Cage"), star date unknown 
% 

は、私が見つけたことは、ファイルを解析するとき、stringWithContentsOfFileが代わりに%記号を持つ文字列を返すことです。例えば:私は、ファイルの内容にcomponentsSeparatedByCharactersInSetを呼び出すとき

@"A little suffering is good for the soul.\n\t\t-- Kirk, \"The Corbomite Maneuver\", stardate 1514.0\n%\nA man either lives life as it happens to him, meets it head-on and\nlicks it, or he turns his back on it and starts to wither away.\n\t\t-- Dr. Boyce, \"The Menagerie\" (\"The Cage\"), stardate unknown\n%" 

しかし、すべてがNSTaggedPointerStringあるパーセント記号を除いて、文字列として解析されます。行を印刷すると、パーセント記号が消えてしまいます。

これはパーセント記号が文字列の書式指定子であるためですか?その場合、最初のコンテンツの引き出しがそれらを逃れるだろうと私は思います。

NSFileManager *fileManager; 
fileManager = [NSFileManager defaultManager]; 
NSStringEncoding stringEncoding; 
// NSString *fileContents = [NSString stringWithContentsOfFile:fileName encoding:NSASCIIStringEncoding error:nil]; 
NSString *fileContents = [NSString stringWithContentsOfFile:fileName usedEncoding:&stringEncoding error:nil]; 
NSArray *fileLines = [fileContents componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]]; 

使用されるエンコーディングはUTF-8されて終わる:

は、ここでは、コードです。私はプレーンなASCIIを指定しようとしましたが、同じ結果が得られることがわかります。

質問には、どうすればパーセント記号を保持できますか?または、それを区切り文字として使用し、後続の結果のそれぞれを個別に解析する必要があります。

+0

私は行を印刷し、パーセント記号は両方の例にあります。 –

+0

@ l'l'lあなたは同じ方法を使いましたか? –

+0

うん、コメントを外してみて、あなたが今持っているものを試してみた - NSLog(@ "%@"、fileLines); 'これが結果だった:https://gist.github.com/anonymous/181ce0d4da733afd42740a0e3dfa676e –

答えて

1

のdoubleとして宣言されているにあなたはNSLog()を呼び出しているが、フォーマット文字列として行の文字列を渡します。次のようになります。

NSLog(lineString); 

したがって、行ストリングのパーセント文字は、フォーマット指定子として解釈されます。外部のソースから来た文字列、つまりコード内でハードコードされていない文字列を、フォーマット文字列として関数(NSLog()printf()+[NSString stringWithFormat:]など)として渡すべきではありません。安全ではなく、あなたが見たような予期しない結果を得ることがあります。あなたは常にこのような単一の文字列ログインする必要があります

:つまり

NSLog(@"%@", lineString); 

を、あなたは、ハードコードされた書式文字列を渡すとデータ形式にそのためのとして外国の文字列を使用する必要があります。

+0

D'oh!あなたが正しい。私の間違いを指摘してくれてありがとう。 –

0

NSTaggedPointerStringはNSStringのサブクラスです。どこでもNSStringとして使用できます。

しかし、あなたの文字列

@"A little suffering is good for the soul.\n\t\t-- Kirk, \"The Corbomite Maneuver\", stardate 1514.0\n%\nA man either lives life as it happens to him, meets it head-on and\nlicks it, or he turns his back on it and starts to wither away.\n\t\t-- Dr. Boyce, \"The Menagerie\" (\"The Cage\"), stardate unknown\n%" 

符号%にパーセント記号ではありません。 Objective-Cのパーセント記号が%マーク

@"%%" 
+0

そうですが、stringWithContentsOfFileが自動的にそれらをエスケープすると思っていたでしょう。私は最初の解析を処理するためにCに落とさなければならないかもしれません。 –

+0

この回答は間違っています。文字列で%をエスケープする必要はありません。パーセント文字は、書式文字列から文字列書式関数などの特定のコンテキストでのみ特殊です。 '@"% "'は1つのパーセント文字を含む完全に有効な文字列です。 –

+0

@KenThomases私はそうは思わない。あなたは@ "%d"で、あなたはそれが本当に "%d"文字列であることを意味しますか? – larva

関連する問題