我有一个代码来测试命令是否与正确的参数一起使用,如果有,则通过调用另一个函数将其附加到文件中。
下面是代码:
void main(int argc, char *argv[]){
char accnum[10];
char fname[30];
char lname[30];
char date[10];
int amt;
FILE *q = fopen("bankdata.csv","r");
if(!q){
fprintf(stderr,"Error, unable to locate the data file bankdata.csv");
exit(100);
}
if(argc == 1 ){
fprintf(stderr,"Error, incorrect usage!\n");
fprintf(stderr,"-a ACCTNUM NAME\n");
exit(1);
}
if(strcmp(argv[1],"-a") == 0){
if(argc < 4){
fprintf(stderr,"Error, incorrect usage!\n");
fprintf(stderr,"-a ACCTNUM NAME\n");
exit(1);
}else if(argc > 3){
if((sscanf(argv[2], "%s", accnum ) == 1 ) &&
(sscanf(argv[3], "%s", fname ) == 1) &&
/*(sscanf(argv[4], "%s", lname ) == 1)*/){ //commented out
add(accnum,fname/*,lname*/);
}
}
}
}
void add(char accnum[], char fname[]/*, char lname[]*/){
// printf("%s, %s, %s", accnum, fname, lname);
size_t line = 0;
char buf[100] = "";
char *term = accnum;
FILE *fp = fopen ("bankdata.csv", "a+");
while (fgets (buf, 100, fp)) { /* read each line */
if (strstr (buf, term)) { /* test for term */
fprintf(stderr,"Error, account number %s already exists\n", accnum);
fclose(fp);
exit(50);
}
if (strchr (buf, '\n')) line++; /* increment line */
}
fprintf(fp,"AC,%s,%s",accnum,fname);
fclose(fp);
}
所以当我输入
./a.out -a 1111 Joe Blow
它会附加到另一个文件
Ac,1111,Joe
问题是,当我尝试添加姓氏(即uncomment && (sscanf(argv[4], "%s", lname ) == 1))
)并使用相同的命令行(./a.out -a 1111 Joe Blow
)时,它给我带来了分段错误,而且我不知道为什么。我还尝试取消对add函数中所有相关部分的注释,但是它没有任何改变。
我认为这与argv [4]为空有关,因为这是编写代码时我以前遇到的问题之一,但是argv [4]应该“吹”对吧?
任何帮助表示赞赏。
答案 0 :(得分:0)
您可以简化一下。
由于您需要使用固定数量的参数, 首先检查是否足够
if (argc != 5)
{
puts("incorrect number of arguments, syntax: {switch} {accountnumber} {firstname} {lastname}");
return -1;
}
参数数目现在是正确的,请继续使用开关检查开关,但首先要确保开关字符串足够长
if (strlen(argv[2])<2)
{
puts("switch must be at least two characters long e.g. -a");
return -2;
}
switch( argv[2][1] )
{
case 'a':
add(argv[3],argv[4], argv[5]);
break;
default:
printf("unrecognized switch %s", argv[2]);
break;
}
void add(char* accnum, char* fname, char* lname)
{
// check arguments for safety
if (accnum == NULL || fname == NULL || lname == NULL)
{
puts("invalid arguments passed to add");
return;
}
...
也许可以对参数进行更多检查,例如它是否是有效的帐号等等。