为什么函数“cat”中的 getopt 函数是这样的? main 内部不能正常工作总是返回-1?
自己编译的函数 cat 工作得很好。我将 char *matrix[]
而不是 char *argv[]
传递给它。我检查了矩阵向量和参数是否正确存储在其中。
问题可能出在哪里?提前致谢! 代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define TRUE 0
#define FALSE 1
void yes(int argc, char *argv[]);
int cat(int argc, char *argv[]);
char buf[50],c[10], *p2,*p, *pch;
int count;
char *matrix[20];
int main(int argc, char *argv[])
{
int t=0;
do
{
fprintf (stderr, "$ ");
fgets (buf,50,stdin);
p=buf;
fprintf (stderr, "Comanda primita de la tastatura: ");
fputs (buf, stderr);
int i=0,j=0;
//strcpy(p,buf);
strcpy(c,"\0");
while (buf[i] == ' ')
{
i++;
p++;
}
if (buf[i] == '#')
fprintf (stderr, "Nici o comanda, ci e un comentariu!\n");
else
{
j=0;
while (buf[i] != ' ' && buf[i] != '\n')
{
i++;
j++;
}
strncpy (c,p,j);
fprintf (stderr, "%s\n",c);
if (strcmp (c,"yes") == 0)
{
p2 = p+j+1;
pch = strtok (p2," ");
count = 0;
while (pch != NULL)
{
//printf ("%s\n",pch);
matrix[count] = strdup(pch);
pch = strtok (NULL, " ");
count++;
}
yes(count, matrix);
fprintf (stderr, "Aici se va executa comanda yes\n");
}
else if (strcmp (c,"cat") == 0)
{
p2 = p+j+1;
pch = strtok (p2," ");
count = 0;
while (pch != NULL)
{
//printf ("%s\n",pch);
matrix[count] = strdup(pch);
pch = strtok (NULL, " ");
count++;
}
cat(count,matrix);
for(t=0;t<count;t++) fprintf(stderr,"|%s|\n",matrix[t]);
printf("asdasd");
fprintf (stderr, "Aici se va executa comanda cat \n");
}
else if (strcmp (c,"tee") == 0)
{
//tee();
fprintf(stderr, "Aici se va executa comanda tee\n");
}
fprintf (stderr, "Aici se va executa comanda basename\n");
strcpy(buf,"\0");
}
}
while (strcmp(c, "exit") != 0);
fprintf (stderr, "Terminat corect!\n");
return 0;
}
int cat(int argc, char *argv[])
{
int c ;
opterr = 0 ;
optind = 0 ;
char number = 0;
char squeeze = 0;
char marker = 0;
while ((c = getopt (argc, argv, "bnsE:")) != -1)
switch (c)
{
case 'b' :
number = 1;
break;
case 'n' :
number = 2;
break;
case 'm' :
marker = 1;
break;
case 's' :
squeeze = 1;
break;
case 'E' :
marker = 1;
break;
}
if (optind + 1 != argc)
{
fprintf (stderr, "\tWrong arguments!\n") ;
return -1 ;
}
char *filename = strtok(argv[optind], "\n");
FILE * fd = fopen (filename, "r");
printf("am deschis fisierul %s ",argv[optind]);
if (fd == NULL)
{
return 1;
}
char line[1025];
int line_count = 1;
while (!feof(fd))
{
fgets(line, 1025, fd);
int len = strlen(line);
if (line[len - 1] == '\n')
{
if(len - 2 >= 0)
{
if(line[len - 2] == '\r')
{
line[len - 2] = '\0';
len -= 2;
}
else
{
line[len - 1] = '\0';
len -= 1;
}
}
else
{
line[len - 1] = '\0';
len -= 1;
}
}
if (squeeze == 1 && len == 0)
continue;
if (number == 1)
{
fprintf (stdout, "%4d ", line_count);
line_count++;
}
else if (number == 2)
{
if (len > 0)
{
fprintf (stdout, "%4d ", line_count);
line_count++;
}
else
fprintf (stdout, " ");
}
fprintf(stdout, "%s", line);
if (marker == 1)
fprintf(stdout, "$");
fprintf(stdout, "\n");
}
fclose (fd);
return 0 ;
}
void yes(int argc, char *argv[])
{
int i;
while (1)
if (puts("y") == EOF)
{
perror("yes");
exit(FALSE);
}
while (1)
for (i = 1; i < argc; i++)
if (fputs(argv[i], stdout) == EOF || putchar(i == argc - 1 ? '\n' : ' ') == EOF)
{
perror("yes");
exit(FALSE);
}
}
The function cat compiled on its own works just fine. I pass char *matrix[]
instead of char *argv[]
to it. I checked the matrix vector and arguments are stored corectly in it.
Where could the problem be? Thanks in advance!
Here comes the code:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define TRUE 0
#define FALSE 1
void yes(int argc, char *argv[]);
int cat(int argc, char *argv[]);
char buf[50],c[10], *p2,*p, *pch;
int count;
char *matrix[20];
int main(int argc, char *argv[])
{
int t=0;
do
{
fprintf (stderr, "$ ");
fgets (buf,50,stdin);
p=buf;
fprintf (stderr, "Comanda primita de la tastatura: ");
fputs (buf, stderr);
int i=0,j=0;
//strcpy(p,buf);
strcpy(c,"\0");
while (buf[i] == ' ')
{
i++;
p++;
}
if (buf[i] == '#')
fprintf (stderr, "Nici o comanda, ci e un comentariu!\n");
else
{
j=0;
while (buf[i] != ' ' && buf[i] != '\n')
{
i++;
j++;
}
strncpy (c,p,j);
fprintf (stderr, "%s\n",c);
if (strcmp (c,"yes") == 0)
{
p2 = p+j+1;
pch = strtok (p2," ");
count = 0;
while (pch != NULL)
{
//printf ("%s\n",pch);
matrix[count] = strdup(pch);
pch = strtok (NULL, " ");
count++;
}
yes(count, matrix);
fprintf (stderr, "Aici se va executa comanda yes\n");
}
else if (strcmp (c,"cat") == 0)
{
p2 = p+j+1;
pch = strtok (p2," ");
count = 0;
while (pch != NULL)
{
//printf ("%s\n",pch);
matrix[count] = strdup(pch);
pch = strtok (NULL, " ");
count++;
}
cat(count,matrix);
for(t=0;t<count;t++) fprintf(stderr,"|%s|\n",matrix[t]);
printf("asdasd");
fprintf (stderr, "Aici se va executa comanda cat \n");
}
else if (strcmp (c,"tee") == 0)
{
//tee();
fprintf(stderr, "Aici se va executa comanda tee\n");
}
fprintf (stderr, "Aici se va executa comanda basename\n");
strcpy(buf,"\0");
}
}
while (strcmp(c, "exit") != 0);
fprintf (stderr, "Terminat corect!\n");
return 0;
}
int cat(int argc, char *argv[])
{
int c ;
opterr = 0 ;
optind = 0 ;
char number = 0;
char squeeze = 0;
char marker = 0;
while ((c = getopt (argc, argv, "bnsE:")) != -1)
switch (c)
{
case 'b' :
number = 1;
break;
case 'n' :
number = 2;
break;
case 'm' :
marker = 1;
break;
case 's' :
squeeze = 1;
break;
case 'E' :
marker = 1;
break;
}
if (optind + 1 != argc)
{
fprintf (stderr, "\tWrong arguments!\n") ;
return -1 ;
}
char *filename = strtok(argv[optind], "\n");
FILE * fd = fopen (filename, "r");
printf("am deschis fisierul %s ",argv[optind]);
if (fd == NULL)
{
return 1;
}
char line[1025];
int line_count = 1;
while (!feof(fd))
{
fgets(line, 1025, fd);
int len = strlen(line);
if (line[len - 1] == '\n')
{
if(len - 2 >= 0)
{
if(line[len - 2] == '\r')
{
line[len - 2] = '\0';
len -= 2;
}
else
{
line[len - 1] = '\0';
len -= 1;
}
}
else
{
line[len - 1] = '\0';
len -= 1;
}
}
if (squeeze == 1 && len == 0)
continue;
if (number == 1)
{
fprintf (stdout, "%4d ", line_count);
line_count++;
}
else if (number == 2)
{
if (len > 0)
{
fprintf (stdout, "%4d ", line_count);
line_count++;
}
else
fprintf (stdout, " ");
}
fprintf(stdout, "%s", line);
if (marker == 1)
fprintf(stdout, "$");
fprintf(stdout, "\n");
}
fclose (fd);
return 0 ;
}
void yes(int argc, char *argv[])
{
int i;
while (1)
if (puts("y") == EOF)
{
perror("yes");
exit(FALSE);
}
while (1)
for (i = 1; i < argc; i++)
if (fputs(argv[i], stdout) == EOF || putchar(i == argc - 1 ? '\n' : ' ') == EOF)
{
perror("yes");
exit(FALSE);
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
通常
argv[0]
包含程序名称。也许getopt
会跳过项目argv[0]
,这会导致问题。Usually
argv[0]
contains program name. Maybegetopt
will skip itemargv[0]
, and that causes a problem.