2010-12-03 14 views
3

テキストファイルから読み込み、特殊文字を削除するプログラムを作成しました。私はifステートメントをより良くコーディングすることはできません。助けてください。私は正しいコードステートメントをオンラインで検索しましたが、すべての高度なコードステートメントがあります。私が学んでいる本には、文字列とファイルのオープンとクローズの最後の(14章)章があります。私は特別な文字の配列を作成しようとしましたが、うまくいきませんでした。私を助けてください!C++紹介:自己学習

 int main() 
    { 


string paragraph = ""; 
string curChar = ""; 
string fileName = ""; 
int subscript=0; 
int numWords=0; 


ifstream inFile; //declaring the file variables in the implement 
ofstream outFile; 


     cout << "Please enter the input file name(C:\owner\Desktop\para.txt): " << endl; 

     cin >> fileName; 


inFile.open(fileName, ios::in); //opening the user entered file 

//if statement for not finding the file 
if(inFile.fail()) 
{ 
    cout<<"error opening the file."; 
} 
else 
{ 
getline(inFile,paragraph); 
cout<<paragraph<<endl<<endl; 
} 


numWords=paragraph.length(); 

while (subscript < numWords) 
{ 

    curChar = paragraph.substr(subscript, 1); 


     if(curChar==","||curChar=="."||curChar==")" 
    ||curChar=="("||curChar==";"||curChar==":"||curChar=="-" 
    ||curChar=="\""||curChar=="&"||curChar=="?"|| 
     curChar=="%"||curChar=="$"||curChar=="!"||curChar=="    ["||curChar=="]"|| 
    curChar=="{"||curChar=="}"||curChar=="_"||curChar==" <"||curChar==">" 
    ||curChar=="/"||curChar=="#"||curChar=="*"||curChar=="_"||curChar=="+" 
    ||curChar=="=") 


    { 
    paragraph.erase(subscript, 1); 
    numWords-=1; 
    } 
    else 
    subscript+=1; 

} 

cout<<paragraph<<endl; 
inFile.close(); 
あなたが与えられた文字の文字列を検索し strchr関数に見たいと思うかもしれません
+1

(a)コードを書式設定し、(b)コード全体を貼り付けると役立ちます。あなたが掲示したコードで中括弧はバランスが取れていません。また、「うまくいきませんでした」と説明する必要があります。何がうまくいかなかったのですか?それはコンパイルされませんでしたか?走らなかったの?それは実行されたが間違った結果を与えるか?走ったのですが、正しい結果を出してクラッシュしましたか? –

+0

あなたはここでより具体的にする必要があります:何がうまくいかないのですか?それはコンパイルに失敗しますか?もしそうなら、エラーメッセージは何ですか?期待される行動は何ですか? – ereOn

+0

私はこれを正しく理解していません。つまり、ファイルを読み込み、特定の文字を削除して閉じることですが、上記のコードは機能しません。 –

答えて

3

include <string.h> 
char *strchr (const char *s, int c); 
strchr関数は、Cの最初の発生を探し

(文字に変換)でsが指す文字列 終了ヌル文字は 文字列の一部と見なされます。

strchr関数は、見つかった文字へのポインタを返すか、文字列に 文字が含まれていない場合はnullポインタを返します。

ような何か:あなたはcharではなくstringと使用としてcurCharを宣言する必要があります

if (strchr (",.();:-\"&?%$![]{}_<>/#*_+=", curChar) != NULL) ... 

curChar = paragraph[subscript]; 

いうより:

curChar = paragraph.substr(subscript, 1); 

をしかし、彼らは比較的小さな変更があり、あなたの目標はI want to change the if statement into [something] more meaningful and simpleだったので、それを達成するにはとても良い方法だと思います。真のIFF cを返し、我々はisalnum(c)のような機能を持っている<cctype>ヘッダで

+0

はポインタを使用できません。 – Luckwhy

+0

'strchr'は私が行く方法ですが、curCharは現在文字列ではありません! @ Luckywhy: 'char'に変更し、' paragraph.substr(subscript、1) 'ではなく' paragraph [subscript] 'に設定する必要があります。 –

+1

@ Luckwhy:確かに、ポインタはうまく動作します。これが宿題でない限り(通常、現実世界に場所がないという愚かな制限がある場合)、そのような場合にはそのようなタグを付けるべきです。自習している場合は、不要な制限を課すよりも、やるべき最善の方法を学ぶ必要があります。 – paxdiablo

1

はalpanumeric文字、isdigit(c)などである...私はあなたが探している条件は

if(isgraph(c) && !isalnum(c))

だと思いますが、Cでなければなりませんcharではなく、std::stringではありません(技術的に言えば、cはintでなければなりませんが、変換は暗黙的です):hth

PSあなたは、C++を学んでいることから、私はあなたに消去のC++イテレータの方法を紹介しますこれは最高のアイデアではありませんが、curCharためstd::stringにこだわっておきたい場合は、cがこのchar c = curChar[0]

+0

私はそれらを使用することができない本でそれらのステートメントが教えられていないので。 – Luckwhy

+2

@Luckwhy:私はあなたの許しを請う?なぜあなたはそれらを使用できないのですか?これは完全に標準的なヘッダーであり、C言語から継承された標準関数です。それらを使用してください: –

0

になります。

for (string::iterator it = paragraph.begin(); 
     it != paragraph.end(); 
     ++it) 
    while (it != paragraph.end() && (*it == ',' || *it == '.' || .......)) 
     it = paragraph.erase(it); 

まず、iteratorを試してください。これはあなたに最高のパフォーマンスを与えるものではありませんが、そのコンセプトは他のC++構造での作業に役立ちます。

if(curChar==","||curChar=="."||curChar==")" ...... 

第二に、単一引用符'と二重引用符"異なります。 charには'を使用します。

+0

'paragraph.erase(it);'の後、イテレータは無効になり、それに続く '++ it'は未定義です。 –

+0

ありがとう、固定。 'erase()'は常に次のイテレータを返します。 –