1

(Cコード)グローバル変数を関数間で受け渡し、メイン関数がそれらを必要とするときにそれらを返すにはどうすればよいですか?参考までに、以下にコードを投稿しました。もちろん、関数プロトタイプを含むヘッダーファイルもありますが、変数名ではなく、閉じ括弧内の変数タイプのみがリストされています...

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include "myheader.h"

char user_filename[150];
char user_filename2[150];
FILE *fp;
FILE *fp2;
int num_shift;

int main()
{
    int choice;     // main variables
    int option;


    char result;
    char ch;
    int offset;
    char character;
    int tmp;

    option = 0;
    num_shift = 0;
    strncpy(user_filename, "not set", sizeof("not set"));
    strncpy(user_filename2, "not set", sizeof("not set"));
    fp = NULL;
    fp2 = NULL;

    choice = menu(num_shift, user_filename, option);   // get user's first selection

    while(choice != QUIT)   //execute so long as choice is not equal to QUIT
    {
        switch(choice)
            {
                case INPUT_FILE:
                    input(user_filename);
                    break;
                case OUTPUT_FILE:
                    output();
                    break;
                case NUM_TO_SHIFT:
                    num_shift = shift(num_shift);
                    printf ("Shift by %d\n",num_shift);
                    break;
                case ENCODE:
                    encode(result, ch, num_shift, character);
                    break;
                case QUIT:
                    quit();
                    break;
                case REVIEW:
                    review (user_filename);
                    break;
                default:
                    printf("Oops! An invalid choice slipped through.  ");
                    printf("Please try again.\n");
            }
      choice = menu(num_shift, user_filename, 0); /* get user's subsequent selections */
    }

   quit();

}


int menu(int num_shift, char * user_filename, int option)
{
    printf("\nText Encoder Service\n\n");
    printf("1.\tEnter name of input file (currently '%s')\n", user_filename);
    printf("2.\tEnter name of output file (currently '%s')\n", user_filename2);
    printf("3.\tEnter number of characters data should be shifted (currently %d)\n", num_shift);
    printf("4.\tEncode the text\n");
    printf("5.\tReview the text in the input file\n");
    printf("\n0.\tQuit\n\n");
    printf("Make your selection: \n");


   while( (scanf(" %d", &option) != 1) /* non-numeric input */
          || (option < 0)               /* number too small */
          || (option > 5))              /* number too large */
   {
      fflush(stdin);                    /* clear bad data from buffer */
      printf("That selection isn't valid. Please try again.\n\n");
      printf("Your choice? ");
   }

    printf("Selecting %d\n\n", option);

    return option;
}

int input(char * user_filename)
{
    printf("Enter the filename of the file to encode:\n");
    printf("(hit the Enter key when done)\n");
    scanf("%s", user_filename);
    printf("Getting %s\n\n", user_filename);

    fp = fopen (user_filename, "r");

    if (fp == NULL)
    {
        printf("\nSorry, I'm unable to open the file (%s) for reading\n", user_filename);
        printf("Please try again.\n");
    }

    else
    {
        fclose(fp);
    }

    return INPUT_FILE;
}


int output()
{
    printf("Enter the filename of the output file to store encoded information:\n");
    printf("(hit the Enter key when done)\n");
    scanf("%s", user_filename2);
    printf("Opening File for Writing %s\n\n", user_filename2);

    fp2 = fopen (user_filename2, "w");

    if (fp2 == NULL)
    {
        printf("\nSorry, I'm unable to open the file (%s) for writing\n", user_filename2);
        printf("Please try again.\n");
    } else
    {
        fclose(fp2);
    }


    //return user_filename;
    return INPUT_FILE;
}


int shift(int num_shift)
{
    printf("Enter the number of letters to shift for each character: \n");
    printf("(hit the Enter key when done)\n");
    scanf("%d", &num_shift);
    printf("Setting shift value to: %d\n\n", num_shift);

    return num_shift;
}


int encode(char result, char ch, int offset, char character2)
{

    int character;

    printf("starting encoding with offset of %d\n", offset);

    fp = fopen(user_filename, "r");
    fp2 = fopen(user_filename2, "w+bc");

    if ((fp == NULL) || (fp2 == NULL))
    {
        printf ("File not found\n");
        return (0);
    }

    fseek(fp, 0, SEEK_SET);

    printf("staring Encoding from %s to %s at position %ld\n", user_filename, user_filename2, ftell(fp));

    int i = 0;
    while(character = fgetc(fp))
    {
        if ( character == EOF)
        {
            //printf("%c",character);
            //fprintf(fp2,"%c",result);
            fclose(fp);
            fflush(fp2);
            fclose(fp2);
            return(0);
        }

        if (isalpha (character))
        {
            if (character >= 'a' && character <= 'z')
            {
                result = character - 'a';
                result = (result + offset) % 26; // 26 letters in the alphabet
                result += 'a';
                if (result < 'a')
                {
                    result = 'z' - ('a' - result)+1;
                }

            } else if (character >= 'A' && character <= 'Z')
            {
                result = character - 'A';
                result = (result + offset) % 26; // 26 letters in the alphabet
                result += 'A';
                if (result < 'A')
                {
                    result = 'Z' - ('A' - result)+1;
                }
            }
            //printf("(%c)",result);
        } else
        {
            result = character;
            //printf("(%x)", result);
        }
        printf("%c",result);
        fprintf(fp2,"%c",result);

    }

    return 0;
}


void quit()
{
    //fclose(fp);
    //fclose(fp2);
    printf("Quiting...Bye!");
    printf("\n");
    exit(0);
}

int review(char * user_filename)
{
    char character;

    fp = fopen(user_filename, "r");

    printf("Showing text from %s file\n", user_filename);
    printf("----------BEGIN OF TEXT--------------\n");
    while(character = fgetc(fp))
    {
        if ( character == EOF)
        {
            printf("%c",character);
            printf("\n----------END OF TEXT--------------\n");
            fclose(fp);
            return(0);
        }
        printf("%c",character);
    }

}
4

2 に答える 2

2

それらをパラメータとして渡す必要はありません。どこからでもアクセスできます(したがって、変数が表示されている限り、グローバルです)。

これらの変数に加えられた変更は(マルチスレッドの問題を除いて)すべての人に表示されるため、関数やメインで問題なく使用できます。

于 2012-08-17T00:18:08.230 に答える
1

グローバル変数にはグローバルスコープがあるため、グローバル変数を渡す必要はありません。つまり、どこからでもアクセスできます。たとえば、別の目的で同じ名前を使用することにした場合、プログラムの後半で副作用が発生する可能性があるため、これは非常に悪いプログラミング手法です。

詳細については、ウィキペディアを参照してください。

于 2012-08-17T00:56:53.983 に答える