(C代码)当主函数也需要全局变量时,如何在函数之间传递全局变量并返回它们?

(C代码)当主函数也需要全局变量时,如何在函数之间传递全局变量并返回它们?,c,C,(C代码)当主函数也需要全局变量时,如何在函数之间传递全局变量并返回它们?我已经在下面发布了我的代码以供参考。当然,我也有一个包含函数原型的头文件,但它们只在括号内列出变量类型,而不是变量名 #include <stdio.h> #include <ctype.h> #include <string.h> #include "myheader.h" char user_filename[150]; char user_filename2[150]; FILE

(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);
    }

}
#包括
#包括
#包括
#包括“myheader.h”
字符用户_文件名[150];
char user_filename2[150];
文件*fp;
文件*fp2;
整数移位;
int main()
{
int choice;//主要变量
int选项;
字符结果;
char ch;
整数偏移量;
字符;
int tmp;
选项=0;
num_shift=0;
strncpy(用户_文件名,“未设置”,大小(“未设置”);
strncpy(用户_文件名2,“未设置”,大小(“未设置”);
fp=NULL;
fp2=NULL;
choice=菜单(num\u shift,user\u filename,option);//获取用户的第一个选择
while(choice!=QUIT)//只要choice不等于QUIT,就执行
{
开关(选择)
{
案例输入文件:
输入(用户文件名);
打破
案例输出文件:
输出();
打破
案例编号到移位:
数值移位=移位(数值移位);
printf(“移位%d\n”,num\u移位);
打破
案例编码:
编码(结果、通道、数字移位、字符);
打破
案例退出:
退出();
打破
个案检讨:
审查(用户文件名);
打破
违约:
printf(“哎呀!一个无效的选择漏掉了。”);
printf(“请重试。\n”);
}
choice=菜单(num\u shift,user\u filename,0);/*获取用户的后续选择*/
}
退出();
}
int菜单(int num\u shift,char*user\u文件名,int选项)
{
printf(“\nText编码器服务\n\n”);
printf(“1.\t输入文件的名称(当前为“%s”)\n,用户\u文件名);
printf(“2.\t输出文件的名称(当前为“%s”)\n,用户\u filename2);
printf(“3.\t应移位的字符数数据(当前为%d)\n”),num\u shift;
printf(“4.\t对文本进行编码\n”);
printf(“5.\t查看输入文件中的文本\n”);
printf(“\n0。\t电路\n\n”);
printf(“进行选择:\n”);
而((scanf(“%d”,&option)!=1)/*非数字输入*/
||(选项<0)/*数字太小*/
||(选项>5))/*数字太大*/
{
fflush(stdin);/*清除缓冲区中的坏数据*/
printf(“该选择无效。请重试。\n\n”);
printf(“您的选择?”);
}
printf(“选择%d\n\n”,选项);
返回选项;
}
int输入(字符*用户\文件名)
{
printf(“输入要编码的文件名:\n”);
printf(“(完成后按回车键)\n”);
scanf(“%s”,用户\u文件名);
printf(“获取%s\n\n”,用户\u文件名);
fp=fopen(用户_文件名,“r”);
如果(fp==NULL)
{
printf(“\n对不起,我无法打开文件(%s)进行读取,\n”,用户\u文件名);
printf(“请重试。\n”);
}
其他的
{
fclose(fp);
}
返回输入文件;
}
int输出()
{
printf(“输入输出文件的文件名以存储编码信息:\n”);
printf(“(完成后按回车键)\n”);
scanf(“%s”,用户\u文件名2);
printf(“正在打开文件以写入%s\n\n”,用户\u filename2);
fp2=fopen(用户_文件名2,“w”);
如果(fp2==NULL)
{
printf(“\n重试,我无法打开文件(%s)进行写入,\n”,用户\u filename2);
printf(“请重试。\n”);
}否则
{
fclose(fp2);
}
//返回用户文件名;
返回输入文件;
}
整数移位(整数移位)
{
printf(“输入每个字符要移位的字母数:\n”);
printf(“(完成后按回车键)\n”);
scanf(“%d”、&num\u移位);
printf(“将移位值设置为:%d\n\n”,num\u shift);
返回num_移位;
}
整数编码(字符结果、字符ch、整数偏移量、字符2)
{
整数字符;
printf(“开始编码时偏移量为%d\n”,偏移量);
fp=fopen(用户_文件名,“r”);
fp2=fopen(用户_文件名2,“w+bc”);
如果((fp==NULL)| |(fp2==NULL))
{
printf(“未找到文件”);
返回(0);
}
fseek(fp,0,SEEK_集);
printf(“在位置%ld处从%s开始编码到%s\n”,用户\文件名,用户\文件名2,ftell(fp));
int i=0;
while(字符=fgetc(fp))
{
如果(字符==EOF)
{
//printf(“%c”,字符);
//fprintf(fp2,“%c”,结果);
fclose(fp);
fflush(fp2);
fclose(fp2);
返回(0);
}
if(isalpha(字符))
{

如果(character>='a'&&character='a'&&character您不需要将它们作为参数传递,您可以从任何地方访问它们(因此是全局的,只要您可以看到变量)


对这些变量所做的任何修改对每个人都是可见的(除了多线程问题)因此,在函数和main中使用它们不会有任何问题。

您不需要传递全局变量,因为全局变量具有全局性,也就是说,它们可以在任何地方访问。这是非常糟糕的编程实践,因为当您决定使用相同的名称时,它可能会在程序中引入副作用例如,为了另一个目的

有关详细信息,请参见。

strncpy(用户文件名,“未设置”,大小(“未设置”);
这是错误的。
strncpy
的最后一个参数是要复制的最大字符数,即