2017-03-04 9 views
-1

私は、次のコードを持っている:出力が変化

それは正しい出力を与える
#include<iostream> 
#include <string.h> 
using namespace std; 
int main(){ 
     char str[100], str1[100]; 
     cin>>str>>str1; 
     char c[strlen(str1)], flag[strlen(str1)]; 
     int i, j, k = 0; 
     for (i = 0; i < strlen(str1); i++) { 
      flag[i] = 0; 
     } 
     for (i = 0; i < strlen(str); i++) { 
      for (j = 0; j < strlen(str1); j++) { 
       if (str[i] == str1[j] && flag[j] == 0) { 
        c[k] = str[i]; 
        k++; 
        flag[j] = 1; 
        break; 
       } 
      } 
     } 
     if (k != 0) 
      cout<<c; 
     return 0; 
} 

(最初の行が入力された):

hello world 
lo 

をしかし、それはする必要があり出力

#include<iostream> 
#include <string.h> 
using namespace std; 
char * func(char * str, char * str1){ 
    char c[strlen(str1)], flag[strlen(str1)]; 
    int i, j, k = 0; 
    for (i = 0; i < strlen(str1); i++) { 
     flag[i] = 0; 
    } 
    for (i = 0; i < strlen(str); i++) { 
     for (j = 0; j < strlen(str1); j++) { 
      if (str[i] == str1[j] && flag[j] == 0) { 
       c[k] = str[i]; 
       k++; 
       flag[j] = 1; 
       break; 
      } 
     } 
    } 
    if (k != 0) 
     return c; 
    return NULL; 
} 
int main(){ 
     char str[100], str1[100]; 
     cin>>str>>str1; 
     cout<<func(str,str1); 
     return 0; 
} 

- 私はこのような、関数内のコードを入れて機能func()の内側に置くこと第二の出力ラインは、ASCII文字 ここでのミスは何が含まれていることを

hello world 

ノートのように来ますか?このような文字列配列を返すことはできませんか?

+0

オンラインのコードジャッジエンジンに関する質問はここでは控えてください。テストケースからどこに失敗したのかは誰にも分かりませんが、これは通常は公開されていないためです。テストしたものがあなたのローカル環境で実行されていたとしても、オンラインチャレンジに適用されるいくつかのエッジケースをテストすることができなかったかもしれません。創造的で見つけよう。さらに、オンラインコンテストを不正行為すること以外にも、長期的にそのような質問の価値はないと考えられ、何も学ばれていません。 –

+0

これは裁判官ベースの質問ではありません!私はちょうど私がなぜ機能を使用したいのかといって、余分な情報についてそれを話しました。主な質問は、出力が変更される理由です。 –

+0

Debug? ........ –

答えて

1

あなたは

return c; 

あなたがスコープの外に出るのローカル変数を返しているときに、それ以外の場合は、func()で、変更

static char c[100]; 
char flag[strlen(str1)]; 

char c[strlen(str1)], flag[strlen(str1)]; 

をお試しください。あなたがいるとき

​​

動作は未定義です。

あなたはcを変換する場合はfunc()によって返さchar *はまだfunc()外に生きていると問題なく使用することができ、static変数です。

+0

ありがとうございます!それはうまくいった。 –

+0

このアプローチでは、呼び出し元が出力バッファ(およびその長さ)を渡す方が一般的です。 –

+0

@KennyOstrom - あなたは正しいです。このケースでは、それがより重要であると思う、OPのために、彼は一時変数のアドレスを返すことができないと理解し、範囲外で使用できることを期待する – max66

0

関数からローカル変数 'c​​'を返しています。プロセッサーが機能から復帰するとすぐに破棄されます。関数内の値を出力するか、宛先文字列を渡してコピーします。

charの代わりに 'string'クラスを使用することをおすすめします。ここ

あなたはまた、staticとして 'C' を宣言することによって解決することができます

#include<iostream> 
#include <string.h> 
using namespace std; 
string func(char * str, char * str1){ 
    char c[strlen(str1)], flag[strlen(str1)]; 
    int i, j, k = 0; 
    for (i = 0; i < strlen(str1); i++) { 
     flag[i] = 0; 
    } 
    for (i = 0; i < strlen(str); i++) { 
     for (j = 0; j < strlen(str1); j++) { 
      if (str[i] == str1[j] && flag[j] == 0) { 
       c[k] = str[i]; 
       k++; 
       flag[j] = 1; 
       break; 
      } 
     } 
    } 
    string s = c; 
    if (k != 0) 
     return s; 
    return NULL; 
} 
int main(){ 
     char str[100], str1[100]; 
     cin>>str>>str1; 
     cout<<func(str,str1); 
     return 0; 
} 

を行きます。しかし、 'c'の長さはハードコード化されるべきです。

関連する問題