Я пытаюсь создать funtion, который принимает указатель на массив символов, его размер и 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!='\0'||*end!='\0');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 для своего сайта.
в блоке кода, начинающемся с: 'for (; (* str! =' \ 0 '|| * end! =' \ 0 '); str ++, end ++)', если строка ввода больше 5 символов, тогда «end» будет указывать за конец буквального «! EXIT» и читать эти символы. Это неопределенное поведение и может/будет считываться на событие сбоя seg. – user3629249
эта строка: if (strlen (str)> = sz) 'никогда не может быть правдой, потому что fgets() предотвратит это событие – user3629249
Функция fgets() также вводит новую строку перед завершением строки с помощью nul-байта (при условии, что string + newline + nul подходит для 20 символов), поэтому нужно использовать что-то вроде: 'strcmp (str, "! exit \ n")' – user3629249