2015-01-11 5 views
0

Я пытаюсь создать 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 для своего сайта.

+0

в блоке кода, начинающемся с: 'for (; (* str! =' \ 0 '|| * end! =' \ 0 '); str ++, end ++)', если строка ввода больше 5 символов, тогда «end» будет указывать за конец буквального «! EXIT» и читать эти символы. Это неопределенное поведение и может/будет считываться на событие сбоя seg. – user3629249

+0

эта строка: if (strlen (str)> = sz) 'никогда не может быть правдой, потому что fgets() предотвратит это событие – user3629249

+0

Функция fgets() также вводит новую строку перед завершением строки с помощью nul-байта (при условии, что string + newline + nul подходит для 20 символов), поэтому нужно использовать что-то вроде: 'strcmp (str, "! exit \ n")' – user3629249

ответ

2
if(strcmp(str,"!exit")==0) 

Это не будет работать, потому что fgets() добавляет символ новой строки символ в конце строки, и вы должны тщательно заменить \n с \0 в-Одер, чтобы выполнить вышеуказанную проверку

+0

Спасибо @Gopi. Я понял. См. Также я решил это (в ответе ниже). –

+0

Ты помог мне найти ответ. Я не знал '' fgets() '' добавляет '\ n' в конце. Я поблагодарил вас. :) –

+0

это (практически) обязательный программист знает ВСЕ детали каждой системной функции, которую они используют в своем коде. поиск Google, используя что-то вроде: «Синтаксис для функции .... в C» будет (почти) всегда возвращать одну или несколько ссылок для подробного описания функции. – user3629249

0

Благодаря @Gopi теперь у меня есть решить мою проблему:

 while(1) 
     { 
      if((*end=='\0')&&(*str=='\n')) return DONE; 
      if((*end!=*str)||(*end=='\0')) break; 
      end++; 
      str++; 
     } 

Другим решением является:

char end[]={'!','e','x','i','t','\n'}; 
    if(strcmp(str,end)==0) return DONE; 
+0

или просто добавьте 'str [strlen (str) -1] = '\ 0';' непосредственно перед циклом 'for'. –

+0

@CoolGuy Да .. Я на самом деле сделал еще два пути. Твоя просто обращена на мою. Благодаря:-) –

 Смежные вопросы

  • Нет связанных вопросов^_^