从函数存储返回的数组

时间:2014-02-12 15:11:29

标签: c++ arrays function return-value

我只是想做一个简单的双人游戏。第一个玩家进入电影,第二个玩家通过使用一些C ++基础知识来猜测它。

movie[] = entered by player 1.
movie_temp[]= a temp array with '_' in it. It updates after every guess by player 2.

我的问题:请参考我调用函数movie_check()的主函数。 这会在每次猜测后更新生命。我希望movie_temp array能够实现同样的目标。 当我运行这个程序时,只有生命被正确更新,正确猜测生命没有减少,但在下一轮中array_temp没有更新,每个气体后反复显示相同的数组。

请帮我创建一个有助于返回数组并将其保存在movie_temp中的函数(就像我一生中所做的那样)。

IDE:Code :: Blocks 编译器:GCC编译器

#include<iostream.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
#include<conio.h>

void display_movie(char movie_temp[], int);
void display_life(int);
int win_player2(char movie_temp[]);
int check_life(char movie[], char, int);


void display_movie(char movie_temp[], int len)
{
    for(int i=0 ; i<len ; i++)
        cout<<movie_temp[i];
}

void display_life(int life)
{
    for(int i=0 ; i<=life ; i++)
        cout<<"\3";
}


int check_life(char movie[], char ch, int life)
{
    int count1=0;
    for(int i=0 ; movie[i]!='\0' ; i++)
    {
        if(movie[i]==ch)
            count1++;
    }
    if(count1==0)
        return --life;
    else
        return life;
}

int win_player2(char movie_temp[])
{
    int count=0;
    for(int i=0 ; movie_temp[i]!='\0' ; i++)
   {
       if(movie_temp[i]=='_')
           count++;
   }
   if(count==0)
        return 0;
   else
        return 1;
}


int main()
{
    char movie[100], movie_temp[100], ch;
    cout<<"Enter the movie: ";
    cin.getline(movie,100);
    int len= strlen(movie);
    system("cls");


    for(int i=0 ; movie[i]!='\0' ; i++)
    {
        if(movie[i]=='a' || movie[i]=='e' || movie[i]=='i' || movie[i]=='o' ||
        movie[i]=='u' || movie[i]==' ')
            movie_temp[i]= movie[i];
        else
            movie_temp[i]='_';
    }

    int life=9;
    cout<<"\nLives left: ";
    display_life(life);


    while(life!=0 || win_player2(movie_temp)!=0)
    {
        cout<<"\n";
        display_movie(movie_temp, len);
        cout<<"\nEnter your guess: ";
        cin>>ch;
        life=check_life(movie, ch, life);
        cout<<"\n\nLives left: ";
        display_life(life);

    }
    getch();
    return 0;
}

enter code here

1 个答案:

答案 0 :(得分:3)

你犯了一个通常的错误:

            movie_temp[i]==movie[i];

应该是

            movie_temp[i]=movie[i];

你的编译器应该尖叫一声警告你...我的确:

note: use '=' to turn this equality comparison into an assignment
                movie_temp[i]==movie[i];

上下文(如果您无法找到该行):

    if(movie[i]==ch)
        {
            movie_temp[i]==movie[i];   // <<<<<<<<<< this is the line that doesn't copy!
            count1++;
        }

更新只是按照编译器给我的警告,我对您的代码进行了一些小的更改,现在它正在运行。大多数情况下,我正在听从&#34;你没有回报价值!&#34;警告的类型(当你没有明确地返回一个值时,编译器会做出一些事情 - 而且很可能你不会发现结果有用)。

关键是移动线

return movie_temp;
for中的check_movie2循环之外的

char* check_movie2(char movie[], char movie_temp[], char ch)
{
    for(int i=0 ; movie[i]!='\0' ; i++)
    {
        if(movie[i]==ch)
            {
                movie_temp[i]=movie[i];
            }
    }
    return movie_temp;
}

还有其他问题 - 但这是最​​难咬你的问题。

获得的经验:如果你的编译器警告你,请听。

为了您的娱乐,这里是我必须运行的代码(并且&#34;主要是工作&#34;。它目前没有正确地打印出来并且在我猜到标题后它要求输入。此外,您可能会考虑使比较不区分大小写,因为您当前对正确的大小写很敏感。)

已更新在您的代码中添加了一些注释和其他修补程序。

#include<iostream>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>

using namespace std;  // <<<< if you want to use 'cout' instead of 'std::cout' etc, you need this

void display_movie(char movie_temp[], int);
void display_life(int);
int win_player2(char movie_temp[]); 
int check_movie(char movie[], char movie_temp[], char, int);
void display_movie(char movie_temp[], int len)
{
    for(int i=0 ; i<len ; i++)
    cout<<movie_temp[i];
}

void display_life(int life) //displays lives left after each guess
{
    for(int i=0 ; i<=life ; i++)
    cout<<"+";     // <<<<< I don't know what you are hoping to print with "\3"
                   // <<<<< Remember that `\` has a special meaning inside a string!
}


int check_movie(char movie[], char movie_temp[], char ch, int life)
{
    int count1=0;
    for(int i=0 ; movie[i]!='\0' ; i++)
    {
        if(tolower(movie[i])==tolower(ch))    // <<<<< consider case insensitive match 
            {
                movie_temp[i]=movie[i];
                count1++;
            }
    }
    if(count1==0)
        {
            life--;
            return life;    //if none of the character is found, life is reduced by 1.
            count1=0;
        }
    return life; // <<<<<< return life here    
}

int win_player2(char movie_temp[])
{
    int count=0;
    for(int i=0 ; movie_temp[i]!='\0' ; i++)
    {
        if(movie_temp[i]=='_')
            count++;
    }  
    return (count==0)?0:1;
}

char* check_movie2(char movie[], char movie_temp[], char ch)
{
    for(int i=0 ; movie[i]!='\0' ; i++)
    {
        if(movie[i]==ch)
            {
                movie_temp[i]=movie[i];
            }
    }
    return movie_temp;
}

int main()
{
    char movie[100], movie_temp[100], ch;
    cout<<"Enter the movie: ";
    cin.getline(movie,100);
    int len= strlen(movie);
    int life=9;
    system("cls");


    for(int i=0 ; movie[i]!='\0' ; i++)
    {
        if(movie[i]=='a' || movie[i]=='e' || movie[i]=='i' || movie[i]=='o' ||
        movie[i]=='u' || movie[i]==' ')
        movie_temp[i]= movie[i];
    else
        movie_temp[i]='_';
    }    //initially displays the movie to player 2 and shows only vowels.

    cout<<"\nLives left: ";
    display_life(life);


    while(life!=0 && win_player2(movie_temp)!=0)  // <<<<< change || to &&
    {
        cout<<"\n";
        display_movie(movie_temp, len);
        cout<<"\nEnter your guess: ";
        cin>>ch;
        life=check_movie(movie, movie_temp, ch, life); 

        /*I need to update the life after each round, or else the initially declared              
         life is passed. */

        cout<<"\n\nLives left: ";
        display_life(life);

    }
    return 0;
}

更新 - &#34;从函数返回指针&#34;

要返回一组数值&#34;,您需要实现许多目标:

  1. 一个功能只能&#34;返回&#34;一个简单的值(int,float,pointer,...)
  2. 如果在函数内创建数组,则需要确保 返回后,分配的空间仍然有效
  3. 您可以将指针传递给函数,并让函数更新空间指针中的值
  4. 关于不同方法的简单示例(C)(包括不起作用的方法):

    不起作用:

       int * foo() {
         int A[]={1,2,3,4,5};
         return A;
       }
    
    int main(void) {
      int *X;
      X = foo();
      printf("%d", X[0]);  // UNDEFINED BEHAVIOR
      return 0;
    }
    

    这不起作用,因为数组A在函数返回时停止存在(&#39;超出范围&#39;)。访问X指向的内存会导致未定义的行为。

    有效,但仅在单线程环境中使用:

       int * foo() {
         static int A[]={1,2,3,4,5};
         return A;
       }
    

    这是有效的,因为数组是static所以它的分配方式不同而且#34;幸存下来&#34;函数返回后。不推荐。

    传递指针和数组大小:(示例增加数组)

    void foo(int *a, int n) {
      int ii;
      for(ii=0;ii<n;ii++) a[ii]++;
    }
    
    int main(void) {
      int n=5;
      int X[5] = {1,2,3,4,5};
      foo(X, 5);  // values in X will be incremented in-place
    

    在另一个数组中返回值:

    void foo(int *A, int *B, int n) {
      int ii;
      for(ii=0; ii<n; ii++) B[ii] = 2 * A[ii];
    }
    
    int main(void) {
      int a[5] = {1,2,3,4,5};
      int b[5];
      foo(a, b, 5);
      printf("%d\n", b[0]);  // returns a value of 2
      return 0;
    }
    

    这开始变得更加明智。最后,如果您希望函数创建一个数组,则可以执行

    int *foo(int n) {
      int *X, ii;
      X = malloc(n * sizeof *X);
      for(ii = 0; ii < n; ii++) X[ii] = 2 * ii;
      return X;
    }
    
    int main(void) {
      int *a;
      a = foo(5);
      printf("%d", a[4]); // will print 8
      free(a);  // remember to do this after you finished using the array or you get a memory leak!
      return 0;
    }
    

    我希望这些额外的例子及其解释可以帮助您更好地理解这些技术。