我正在尝试用C编写我的第一个项目,并且在内存泄漏方面存在一些问题。我找不到错误,但我认为do-while循环有问题。该程序编译,但当我尝试打开它时,我得到一个分段错误错误。我做错了什么?
我在程序中打开的文件是带有字符序列的.txt,例如:dvorndvl。
我的目标是:我用参数打开程序,打开名为argv [1]的文件,并将字符序列从文件写入数组。
这是我的代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"file1.h"
#include"file2.h"
void bye(){
puts("See you!");
}
int main(int argc, char *argv[]) {
char a[30];
int i, x;
printf("-----SOME TEXT-----");
FILE *f;
f = fopen(argv[1], "r");
if (f = NULL) {
printf("User doesn't exist.\n");
exit(1);
}
else{
do{
a[i] = getc(f);
i++;
} while(a[i]!=EOF);
char b[30];
printf("Password? ");
scanf("%c", b);
if(strcmp(a,b) == 0){
printf("\nHi, %s!\n", argv[1]);
printf("What do you want to do?");
printf("1. Turn the devices on/off. \n");
printf("2. Change my password. \n");
printf("3. -EXIT-\n");
switch(x) {
case 1:
devices(); break; //in file1
case 2:
encrypt(argv[1]); break;//in file2
case 3:
atexit(bye); break;
}
}
else
printf("Password is incorrect\n");
}
fclose(f);
return 0;
}
答案 0 :(得分:2)
我没有50个声誉给你一个评论:( 但 我想* f的处理程序是一个问题。你不会检查是否&#39; f&#39;是NULL但您将f指定为NULL。
if (f=NULL) {
printf("User doesn't exist.\n");
exit(1);
应该是:
if (f==NULL) {
printf("User doesn't exist.\n");
exit(1);
好的做法是始终检查NULL是否相等f:
if (NULL == f) {
printf("User doesn't exist.\n");
exit(1);
在这种情况下如果你弄错了,程序将无法编译:)
答案 1 :(得分:2)
这里有数字或小错误 第一次
int i, x;
i
没有值,所以你不能用i++
来提高它
也
if (f = NULL) {
应更改为if (f == NULL) {
char a[30];
和getc
风险非常大,您应该使用临时字符串malloc
一个符合您需求的数组,并从getc
切换到fgetc
答案 2 :(得分:2)
反转比较的建议(NULL == f)既无关紧要又不好。
真正的问题是你编写的代码错误,可能源于使用不良资源进行学习。
我怀疑你正在使用gcc,只是将目标文件作为参数传递。
相反,你应该传递-Wall和可能的其他标志,如下所示:
$ gcc -Wall -Wextra crap.c
crap.c: In function ‘main’:
crap.c:18:5: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
if (f = NULL) {
^~
正如您所看到的,编译器发现无意识的分配没有问题,您只需要问它。它还可以发现无数其他问题,你知道上述标志要求它。
另请注意,如果2个变量处于正常状态,那么逆转比较将无济于事,例如:将if(foo = bar)切换为if(bar = foo)对你没有任何帮助。另一方面,要求编译器警告您遇到的问题。
如果您使用的是其他编译器,那么它肯定有办法启用警告。为了论证,如果你有一个不能进行基本分析的,请停止使用它。 我强烈建议你如果(NULL == f),因为这与最常用的风格相反,并且如上所述它对任何事情没有帮助。
代码仍然非常错误,超出了编译器可以轻易发现的范围。我可以稍后再去注释。
答案 3 :(得分:1)
这里有一些问题:
if (f = NULL) {
您正在将f
更改为NULL
,而不是针对NULL
对其进行测试。使用==
。为了防止将来出现这种错误,请将r值放在左侧,如下所示:
NULL == f
下一步:
char b[30];
scanf("%c", b);
如果您打算使用scanf
来读取字符串,则需要使用%s
格式说明符,而不是%c
,这是单个字符。我根本不会使用scanf
;请使用fgets
,因为它更安全。