gpt4 book ai didi

c - 我的解码器有什么问题?为什么在提示用户后它会卡住?

转载 作者:太空宇宙 更新时间:2023-11-04 01:03:05 24 4
gpt4 key购买 nike

目标是提示用户编码输入文件并将代码写入输出文件或解码输入文件并将消息写入输出文件。每当我运行该程序时,尽管它可以编译,但只要输入提示字符,它就会停止响应。

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <string.h>

int encode(FILE * fp1, FILE * fp2);
int decode(FILE * fp1, FILE * fp2);
int main() {
char prompt;
printf("Would you like to encode a message into a file?\n");
printf("Or would you like to decode a message from a file?\n");
printf("Enter e to encode or d to decode.\n");
scanf("%c", prompt);
FILE *fp1, *fp2;
char filename1[INT_MAX], filename2[INT_MAX];
printf("Enter input file: ");
scanf("%s", filename1);
fp1 = fopen(filename1, "r");
printf("Enter output file: ");
scanf("%s", filename2);
fp2 = fopen(filename2, "w");
if (fp1 == NULL) {
printf("The file does not exist.\n");
return 0;
}
if (fp2 == NULL) {
printf("The file oes not exist.\n");
return 0;
}
switch (prompt) {
case 'e':
encode(fp1, fp2);
break;
case 'E':
encode(fp1, fp2);
break;
case 'd':
decode(fp1, fp2);
break;
case 'D':
decode(fp1, fp2);
break;
default:
break;
}
return 0;
}

int encode(FILE * fp1, FILE * fp2) {
char ci, co;
while (fscanf(fp1, "%c", ci) != EOF) {
for (ci = 97; ci <= 122; ci++)
co = ci - 64;
for (ci = 48; ci <= 57; ci++)
co = ci + 11;
switch (ci) {
case 32:
co = 69;
break;
case 10:
co = 70;
break;
case 13:
co = 71;
break;
default:
break;
}
fprintf(fp2, "%c", co);
}
printf("Your message has been encoded.\n");
system("pause");
return 0;
}

int decode(FILE * fp1, FILE * fp2) {
char ci, co;
while (fscanf(fp1, "%c", ci) != EOF) {
for (ci = 33; ci <= 58; ci++)
co = ci + 64;
for (ci = 59; ci <= 68; ci++)
co = ci - 11;
switch(ci) {
case 69:
co = 32;
break;
case 70:
co = 10;
break;
case 71:
co = 13;
break;
default:
break;
}
fprintf(fp2, "%c", co);
}
printf("Your message has been decoded.\n");
system("pause");
return 0;
}

最佳答案

可能还有其他问题,但第一个问题在这里:

scanf("%c", prompt);

应该是

scanf("%c", &prompt);

查看完整函数定义和示例 here

此外,

char filename1[INT_MAX], filename2[INT_MAX];

这不可能是个好主意。要么动态分配,要么至少为文件名使用更合理的数字。 256 对于文件名应该足够了。如果您真的担心家庭作业中的缓冲区溢出,您可以使用提到的技术 here为输入字符串正确分配内存(只要您使用的是 GNU 编译器):

char *str;
printf("Enter your filename:\n");
scanf("%ms", &str);

printf("Hello %s!\n", str);
free(str);

%m 会自动分配一个适当大小的字符串,避免缓冲区溢出。

这个只是为了便于阅读:

    switch (prompt) {
case 'e':
encode(fp1, fp2);
break;
case 'E':
encode(fp1, fp2);
break;
case 'd':
decode(fp1, fp2);
break;
case 'D':
decode(fp1, fp2);
break;
default:
break;
}

可以浓缩为:

switch (prompt) {
case 'e':
case 'E':
encode(fp1, fp2);
break;
case 'd':
case 'D':
decode(fp1, fp2);
break;
default:
break;
}

关于c - 我的解码器有什么问题?为什么在提示用户后它会卡住?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30768510/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com