我正在开发自己的多行输入功能,我想终止时无法终止
I am developing my own multi-line input function, can't terminate when I want to
我正在尝试创建一个函数,它将指向字符数组的指针、它的大小和 1 作为参数。
#include<stdio.h>
#include<string.h>
#define FIRST_LINE 1
#define DONE 2
#define MORE_LINES 3
#define EXTRA 4
int a_fun(int, char *, size_t);
main()
{
char que[20];
int status=0;
status=a_fun(FIRST_LINE,que, sizeof(que));
fputs(que,stdout);
printf("\nStatus:\t %d\n",status);
return 0;
}
int a_fun(int lnum, char *str, size_t sz)
{
char *temp, ch, *end="!exit";
if(lnum==FIRST_LINE)
{
if (fgets (str, sz, stdin) == NULL)
{
printf("\nEntered nothing at all. (Type !exit to terminate)\n");
return FIRST_LINE;
}
for(;(*str!='[=10=]'||*end!='[=10=]');str++,end++)
{
if(!*str) if(!*end) return DONE;
}
if(strlen(str)>=sz)
{
while((ch=getchar())!='\n'); //cleaning buffer
return EXTRA;
}
return MORE_LINES;
}
}
我想通过输入“!exit”来退出输入,但我做不到。我尝试用 if(strcmp(str,"!exit")==0) return DONE;
和 if(str=="!exit") return DONE;
最后,我试图逐个字符地比较两者,但都是一脉相承的。请尝试给我一些解决方案。
要输入更多行,我们可以在 a_fun() 中使用条件块,所以基本上现在它只是一行输入函数,我的问题是终止中间的输入过程(如果它进入多行-在线状态).
除了我原来的问题,如果你能给我任何关于使这个功能更安全的建议,我将不胜感激,因为我将在我的网站的 CGI 代码中使用这个功能。
if(strcmp(str,"!exit")==0)
这将不起作用,因为 fgets()
在输入的末尾添加了一个换行符,您必须小心地将 \n
替换为 [=13=]
in-oder 以执行上述检查
谢谢@Gopi 现在我已经解决了我的问题:
while(1)
{
if((*end=='[=10=]')&&(*str=='\n')) return DONE;
if((*end!=*str)||(*end=='[=10=]')) break;
end++;
str++;
}
另一个解决方案是:
char end[]={'!','e','x','i','t','\n'};
if(strcmp(str,end)==0) return DONE;
我正在尝试创建一个函数,它将指向字符数组的指针、它的大小和 1 作为参数。
#include<stdio.h>
#include<string.h>
#define FIRST_LINE 1
#define DONE 2
#define MORE_LINES 3
#define EXTRA 4
int a_fun(int, char *, size_t);
main()
{
char que[20];
int status=0;
status=a_fun(FIRST_LINE,que, sizeof(que));
fputs(que,stdout);
printf("\nStatus:\t %d\n",status);
return 0;
}
int a_fun(int lnum, char *str, size_t sz)
{
char *temp, ch, *end="!exit";
if(lnum==FIRST_LINE)
{
if (fgets (str, sz, stdin) == NULL)
{
printf("\nEntered nothing at all. (Type !exit to terminate)\n");
return FIRST_LINE;
}
for(;(*str!='[=10=]'||*end!='[=10=]');str++,end++)
{
if(!*str) if(!*end) return DONE;
}
if(strlen(str)>=sz)
{
while((ch=getchar())!='\n'); //cleaning buffer
return EXTRA;
}
return MORE_LINES;
}
}
我想通过输入“!exit”来退出输入,但我做不到。我尝试用 if(strcmp(str,"!exit")==0) return DONE;
和 if(str=="!exit") return DONE;
最后,我试图逐个字符地比较两者,但都是一脉相承的。请尝试给我一些解决方案。
要输入更多行,我们可以在 a_fun() 中使用条件块,所以基本上现在它只是一行输入函数,我的问题是终止中间的输入过程(如果它进入多行-在线状态).
除了我原来的问题,如果你能给我任何关于使这个功能更安全的建议,我将不胜感激,因为我将在我的网站的 CGI 代码中使用这个功能。
if(strcmp(str,"!exit")==0)
这将不起作用,因为 fgets()
在输入的末尾添加了一个换行符,您必须小心地将 \n
替换为 [=13=]
in-oder 以执行上述检查
谢谢@Gopi 现在我已经解决了我的问题:
while(1)
{
if((*end=='[=10=]')&&(*str=='\n')) return DONE;
if((*end!=*str)||(*end=='[=10=]')) break;
end++;
str++;
}
另一个解决方案是:
char end[]={'!','e','x','i','t','\n'};
if(strcmp(str,end)==0) return DONE;