2011-02-02 12 views
-1

を私を導いてください、私を導いてください(C++)。私は私のコードのcharに問題がある、私は私のコードのcharとの問題を抱えている(C++)

私はこのエラーがあります:Run-Time Check Failure #3 - The variable 'op' is being used without being initialized。それはどういう意味ですか、どうすれば修正できますか?私はあなたがあなたのオペアンプの変数のためのC-文字列(char *)を使用するのではなく、標準テンプレートライブラリstring classをチェックアウトするべきだと思い

#include <stdio.h> 
#include <iostream> 
#include <stdlib.h> 
#include <conio.h> 
#include <math.h> 

using namespace std; 
enum Operations {SIN1, COS1, TAN1}; 

void selectenteroperation(char *szInput) { 
    char *szLabels[3] = {"sin", "cos", "tan"}; 
    int i=0; 
    while(strcmp(szInput,szLabels[i])==0) 
     ++i; 
    switch (i) 
    { 
     case SIN1: { cout<<"SIN"; break; } 
     case COS1: { cout<<"COS"; break; } 
     case TAN1: { cout<<"TAN"; break; } 
     default: { cout<<"Wrong"; break; } 
    } 
} 

void main() { 
    char *op; 
    cout<<"op?"; 
    cin>>op; 
    if(strcmp(op,"sin")==0) selectenteroperation("sin"); 
    if(strcmp(op,"cos")==0) selectenteroperation("cos"); 
    if(strcmp(op,"tan")==0) selectenteroperation("tan"); 
} 
+2

あなたの問題は何ですか? – GWW

+0

私はこのエラーがあります:ランタイムチェック失敗#3 - 変数 'op'は初期化されずに使用されています。 – Aliexo

+3

質問の本文にすべての関連コードを掲載してください。質問はスタンドアロンでなければなりません。彼らは外部リンクに頼るべきではありません。 –

答えて

2

は、これは私のコードです。

while(strcmp(szInput,szLabels[i])==0) 

編集

while(strcmp(szInput,szLabels[i])!=0) 

へ:私はあなたを推測している

+0

例は? – Aliexo

+1

http://www.cprogramming.com/tutorial/string.html – GWW

2

は、おそらくラインを変更したいが、私は2を超えていないあなたも確認するために、ここでのテストを持っている必要があります。

そしてもちろん、あなたはまた、このように、* OPのためにメモリを割り当てる必要があります。

char *op = new char[256] ; 

(私はここに任意に256を選択しました)。

UPDATE:私は3未満であることをテストするには: - あなたは、charへのポインタを持って

while(i<3 && strcmp(szInput,szLabels[i])!=0) 
+0

TNX、これは仕事ですが、私は1つの問題を抱えています。スイッチの私の大文字と小文字は問題ありません。( – Aliexo

+0

ええ、あなたは私がより少ないことを確認する必要がありますあなたのテストで3より。私の更新を参照してください。 –

0

答えは、あなたが文字を持っていないということです。ポインタは初期化されていません。

char *op; 
cout<<"op?"; 
cin>>op; 

char *op = new char[100]; 

ような何かをするか、または代わりのstd ::文字列を使用します。

5

char *opは、ではなく、の文字列を保持するためのバッキングストレージです。

これはC++であるため、std::stringを使用する必要があります。古いスタイルのC文字列には用途がありますが、使いやすい文字列はその1つではありません。

抱擁C++これは宿題のように見えるので、それは:-)

あるとC++の達人として自分自身をオフに渡そうと十分なCプログラマよりも多いことは、私はあなたに完全に固定されたプログラムをあなたに戻って与えることはありませんが、私は、あなたのテストのための基礎として使用することができるものを与えると、もっと重要なのは、理解:

pax$ cat qq.cpp ; g++ -o qq qq.cpp 
#include <iostream> 
int main (void) { 
    std::string s; 
    std::cout << "Enter something: "; 
    std::cin >> s; // or getline (std::cin, s). 
    std::cout << "You entered [" << s << "]" << std::endl; 
    return 0; 
} 

pax$ ./qq 
Enter something: hello 
You entered [hello] 

また、あなたは本当にはC文字列を使用したい場合は、何かのように:

#include <iostream> 
int main (void) { 
    char s[256]; 
    std::cout << "Enter something: "; 
    std::cin.getline (s, sizeof (s)); 
    std::cout << "You entered [" << s << "]" << std::endl; 
    return 0; 
} 

でもよい。

0
 
char *op; 
cout>op; 

上記のコードは間違っています。初期化されていないメモリに書き込みしようとしています!!

はchar配列またはその代わりにあなたはuninitalized char*ポインタに読んでいる生のchar型のポインタ

1

の文字列を使用してみてください。 (やや危険な修正であれば)書くことになり、迅速に:

char op[100]; 

代わりの

char* op; 

が、STDを使用して::文字列他の人が指摘したように、はるかに安全です。

0

あなたのコードでは、多くの問題があります。

  • strcmpリターンを0文字列が等しい場合、それらは異なるしているではないときにszLabelsの終わりに到達後、あなたが探して停止する方法を考えなければならない
  • 文字列リテラルを変更することはできませんので、それはそのような場合にはconst char *を使用することをお勧めします
  • mainは(それはではありません、そのように宣言してはなりません機能)
  • cin >> op
  • C++は、上記の問題の多くを解決することができstd::stringクラスがあり、ここで
を使用するには、ちょうどいいものだそうです、あなたの入力に必要なメモリを割り当てるするつもりはありません

私はあなたが気分に腹を立てないように願っていますが、プログラミングについて学ぶための最初の言語としてC++を使用しているようです。私は個人的にこれが災害のレシピだと思っています。

いくつかの奇妙な理由で本当にこの困難なパスを使用する必要がある場合は、私の提案はgood introductory bookから始まり、次に例を示します。

C++は単に「試してみてください」のための適切な言語ではありません。 IMOはコードを入力してコンパイルしようとすると一般的に悪いですが、C++のように強力で複雑ですが非対称な言語では本当の自殺です。特に間違いを犯すとC++はちょうどlaugh at you間違いはどこですか?

関連する問題