Ошибка сегментирования
У меня возникла такая проблема. Я написал прогу, скомпилил, а когда запускаю, что выдается следующее сообщение: Ошибка сегментирования. Вот код:
Код:
#include <time.h>
#include <stdio.h>
#include <string.h>
#define INFO_PATH "/root/info/calls.txt"
typedef struct _INFO_ {
char pWho[30];
char pDateTime[30];
char pDirection[30];
} CALL_INFO ;
int main(int argc, char** args)
{
time_t now;
time(&now);
FILE* infoFile = NULL;
if (strcmp(args[1], "set") == 0) {
if (strlen(args[2]) == 0)
printf("User name is missing!");
else if (strlen(args[3]) == 0)
printf("Direction argument is missing!");
else {
if ((infoFile = fopen(INFO_PATH, "a+")) == NULL) {
printf("Unable to open info file in %s\n", INFO_PATH);
return 1;
}
CALL_INFO info;
strcpy(info.pWho, args[2]);
strcpy(info.pDirection, args[3]);
strcpy(info.pDateTime, asctime(localtime(&now)));
fwrite(&info, sizeof(CALL_INFO), 1, infoFile);
fclose(infoFile);
}
}
else if (strcmp(args[1], "view") == 0) {
if ((infoFile = fopen(INFO_PATH, "r")) == NULL) {
printf("Unable to open info file in %s\n", INFO_PATH);
return 1;
}
CALL_INFO info;
printf("Date\tWho\tCall Direction\n");
while (!feof(infoFile)) {
fread(&info, sizeof(CALL_INFO), 1, infoFile);
printf("%s\t%s\t%s\n", info.pDateTime, info.pWho, info.pDirection);
}
fclose(infoFile);
}
else
printf("Use syntax:\n\tto add record: pr set username direction\n\tto view: pr view\n");
return 0;
}
#include <stdio.h>
#include <string.h>
#define INFO_PATH "/root/info/calls.txt"
typedef struct _INFO_ {
char pWho[30];
char pDateTime[30];
char pDirection[30];
} CALL_INFO ;
int main(int argc, char** args)
{
time_t now;
time(&now);
FILE* infoFile = NULL;
if (strcmp(args[1], "set") == 0) {
if (strlen(args[2]) == 0)
printf("User name is missing!");
else if (strlen(args[3]) == 0)
printf("Direction argument is missing!");
else {
if ((infoFile = fopen(INFO_PATH, "a+")) == NULL) {
printf("Unable to open info file in %s\n", INFO_PATH);
return 1;
}
CALL_INFO info;
strcpy(info.pWho, args[2]);
strcpy(info.pDirection, args[3]);
strcpy(info.pDateTime, asctime(localtime(&now)));
fwrite(&info, sizeof(CALL_INFO), 1, infoFile);
fclose(infoFile);
}
}
else if (strcmp(args[1], "view") == 0) {
if ((infoFile = fopen(INFO_PATH, "r")) == NULL) {
printf("Unable to open info file in %s\n", INFO_PATH);
return 1;
}
CALL_INFO info;
printf("Date\tWho\tCall Direction\n");
while (!feof(infoFile)) {
fread(&info, sizeof(CALL_INFO), 1, infoFile);
printf("%s\t%s\t%s\n", info.pDateTime, info.pWho, info.pDirection);
}
fclose(infoFile);
}
else
printf("Use syntax:\n\tto add record: pr set username direction\n\tto view: pr view\n");
return 0;
}
Я только начал програмить под Unix, так что не судите строго если я где-то дал маху.
Заранее спасибо.
Код:
if (strcmp(args[1], "set") == 0) {
Нельзя так делать, ибо неизвестно существует ли вобще args[1]. Параметров командной строки может и не быть и тогда програма сразу упадет при запуске. Всегда надо сначала проверять количество реальных параметров в argc. Это впринципе языка C касаеться а не только програмирования под UNIX системы )
Я не указал как я компилирую и запускаю прогу:
компилирование: g++ -o main main.cpp
запуск: ./main
Ну собственно тогда понятно - ловится тот баг о котором я говорил.
Да уж не жучок, а жучище целый :) !
Спасибо aks!