这里有一些代码无法正确编译,因为当我在main函数中测试一个非null表达式时,它说我的指针已经为空。这是代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXCODE 53
#define MAXMESSAGE 256
void getCode(char *codeIn, char *filename) {
FILE *codeFile;
/* Open the file with the code */
codeFile = fopen(filename, "r");
if (codeFile == NULL) {
printf("Error opening the code file - program terminated\n");
exit(1);
}
/* Read the first (and assumed only) line from the file */
fgets(codeIn, MAXCODE, codeFile);
/* Terminate the string with /0 */
codeIn[MAXCODE] = '\0';
/* Close the file */
fclose(codeFile);
return;
}
int getMessage(int *message, char *filename) {
FILE *messageFile;
int counter = 0;
/* Open the file with the message */
messageFile = fopen(filename, "r");
if (messageFile == NULL) {
printf("Error opening the message file - program terminated\n");
exit(1);
}
/* Read one number at a time from the file and store it */
while (!feof (messageFile))
{
fscanf (messageFile, "%d", (message+counter));
counter++;
}
/* Close the file */
fclose(messageFile);
return (counter);
}
void sortMessage(int *message, int size) {
int i, j, temp;
for (i=0; i<size-1; i++) {
for (j=i; j<size; j++) {
if (message[i]>message[j]) {
temp = message[i];
message[i] = message[j];
message[j] = temp;
}
}
}
return;
}
void decodeMessage(char *codeIn, int *message, int size) {
FILE *outputFile;
int i = 0;
/* Open the output file */
outputFile = fopen("csis.txt", "w");
if (outputFile == NULL) {
printf("Error opening the output file - program terminated\n");
exit(1);
}
for (i=0; i< size; i++) {
fprintf(outputFile, "%c", codeIn[message[i]%100]);
printf("%c", codeIn[message[i]%100]);
}
printf("\n");
/* Close the file */
fclose(outputFile);
return;
}
int main(int argc, char *argv[])
{
char code[MAXCODE];
int msg[MAXMESSAGE];
int msgSize;
if (argc != 3) {
printf("This program takes two arguments: the name of the file with the code, and the name of the file with the encoded message\n");
}
getCode(code, argv[1]);
msgSize = getMessage(msg, argv[2]);
sortMessage(msg, msgSize);
decodeMessage(code, msg, msgSize);
return;
}
所以基本上我的代码使用了两个名为codefile.txt和msgfile.txt的文件来解码秘密消息,并将解码后的序列写入一个名为csis的新文本文件。
答案 0 :(得分:1)
正如woolstar在评论中指出的那样,你不需要在codeIn
之后终止你的fgets
数组,因为fgets
会为你做到这一点。实际上,这构成了溢出,我们可以通过考虑MAXCODE
为1时发生的情况来最好地看到:codeIn
只包含一个元素:codeIn[0]
,访问codeIn[1]
是一个错误。
同样,由于MAXCODE
为53
且codeIn
指向的元素数量,codeIn[message[i]%100]
是可疑的,因为message[i]%100
可能存在message[i]
索引无效。虽然我们正在阅读此说明,但将unsigned int
设为printf
以使其不能为负数可能是明智之举。与scanf
对应的格式说明符(适用于unsigned int
和%u
)为while ( !feof(messageFile) )
。
EOF
错误,因为在读取尝试之前未设置EOF
标志。但是,在尝试阅读和counter
测试之间,您已经增加while (fscanf(messageFile, "%d", (message+counter)) == 1)
{
counter++;
}
,这意味着您已计算了太多项目。也许你的循环应该是这样的:
message[i]
请注意,此代码假定您选择将int
保留为unsigned int
。如果您选择使用%u
,那么您当然希望使用feof
格式说明符。
你可能会发现feof
大多是多余的......你通常可以通过检查返回值来测试错误的读取。尽量避免将来main
。
您的int
函数的返回类型为return;
,但在其末尾您有一个int
语句,该语句不返回argv != 3
值。删除它。它可能在编译期间导致错误。
据推测,当main
想要从int
返回时,您最终无法处理无效参数...请确保返回if (argc != 3) {
printf("This program takes two arguments: the name of the file with the code, and the name of the file with the encoded message\n");
return 0;
}
值,例如
{{1}}