0

文字配列へのポインター、そのサイズ、および 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」と入力して入力を終了したいのですが、それができません。私はそれを withif(strcmp(str,"!exit")==0) return DONE;と with でやろうとしましたif(str=="!exit") return DONE;
最後に、両方の文字を文字ごとに比較しようとしましたが、すべて同じです。解決策を教えてください。

より多くの行を入力するには、a_fun() で条件付きブロックを使用できるため、基本的に現在は 1 行の入力関数であり、私の問題はその間に入力プロセスを終了することです (複数行の状態になる場合)。

私の元の問題に加えて、この機能をより安全にするための提案をいただければ幸いです。私のWebサイトのCGIコードでこの機能を使用する予定だからです。

4

2 に答える 2

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

入力の最後に改行文字を追加し、上記のチェックを実行するには慎重に in-oderにfgets()置き換える必要があるため、これは機能しません。\n\0

于 2015-01-11T06:44:25.743 に答える
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;
于 2015-01-11T06:56:29.113 に答える