【发布时间】:2015-01-15 22:35:30
【问题描述】:
我在第 24 行 (fgets) 中遇到了分段错误(核心转储)错误。我对c不是很熟悉,但我必须为我的课程制作一个程序。我有以下代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char* argv[]){
FILE *fd1, *fd2;
char *str1, *str2;
char *salt, *hash, *key, *key1;
char buf[13], word[200], pass[200];
if(argc != 2){
fprintf(stderr, "Usage: %s <file shadow>\n", argv[0]);
exit(1);
}
str1 = (char*) malloc(100);
str2 = (char*) malloc(100);
fd1 = fopen(argv[1], "r");
fprintf(stderr, "Please, wait...\n");
while(fgets(str1, 100, fd1) != NULL){
str2 = strstr(str1, "$1$");
if(str2 != NULL){
key = strtok(str2, ":");
snprintf(pass, sizeof(pass), "%s", key);
printf("pass=%s (%lu)\n", pass, strlen(pass));
strtok(key, "$");
salt = strtok(NULL, "$");
hash = strtok(NULL, "\0");
snprintf(buf, sizeof(buf), "$1$%s$", salt);
fd2 = fopen("polish.txt", "r");
while(fgets(word, 200, fd2) != NULL){
(&word[strlen(word)])[-1] = '\0';
key1 = crypt(word, buf);
if(!strncmp(key1, pass, strlen(key1))){
printf("OK!, The password is: %s\n\n", word);
break;
}
}
}
}
fclose(fd1);
fclose(fd2);
free(str1);
free(str2);
return 0;
}
当我尝试读取 /etc/shadow 文件时,它会引发分段错误(也尝试使用自定义 txt 文件)。有人可以看看这个吗?
【问题讨论】:
-
你做了什么调试?它在哪里崩溃?如果您不知道如何使用调试器读取核心转储,那么您应该学习这一点,以便您可以调试此类问题。
-
他在这样一个古老的 unix 系统上,调试仍然被认为是只为弱者服务的 ;)
-
次要:为什么使用
"%lu"而不是"%u"或正确的"%zu"? -
1) 幻数(在本例中为 100 和 200)是维护的噩梦。建议对每个数字使用#define,并用#define 名称替换硬编码的幻数。 2) 始终检查 strtok 的返回值以确保操作成功。 3) 始终检查 fopen() 的返回值以确保操作成功。
-
建议每行声明一个(1)局部变量,带有初始值和注释,这样(稍后)你和(现在)我就知道变量的用途。当有人(我)试图对你的代码进行逆向工程以试图帮助你时,这样的 cmets 会很有帮助
标签: c segmentation-fault fgets