(C代码)当主函数也需要全局变量时,如何在函数之间传递全局变量并返回它们?
(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
#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
的最后一个参数是要复制的最大字符数,即