2

私は自分のコードから始めます:

char input[40];
fgets( input, 40, stdin );
if( checkPalin(input) == 0 ) {
    printf("%s ist ein Palindrom \n", input);
}
else {
    printf("%s ist kein Palindrom \n", input);
}

私がやりたいことは次のとおりです。いくつかの標準入力を読み取り、回文であるかどうかを関数で確認します。

私の問題は次のとおりです。標準入力の長さを取得するにはどうすればよいですか? それが40文字より大きい場合、エラーメッセージを入れたいし、さらに、char配列を実際の入力の正確な長さにしたいからです。

誰でも私を助けることができますか?

4

4 に答える 4

1

fgets( input, 40, stdin );

入力の長さは 40 文字を超えてはなりません == 39 文字 + ヌル文字

39 文字を超える長さの文字列を指定すると、fgets()最初の 39 文字が読み取られnul character('\0')、40 文字として配置され、残りの文字は無視されます。

39 文字未満の文字列を指定した場合、たとえば 5 の場合、改行を読み取り、長さが 6 になります (ヌル文字を除く)

改行文字を削除することを忘れないでください。

char input[60];
fgets(input,sizeof input,stdin);

たとえば、入力バッファ サイズを 60 程度と宣言した場合、40 文字を超えるエラー チェックを実行する必要があります。

strlen()長さが40を超えていることを確認するだけで、エラーメッセージを表示できます

fgets()チェックアバスでエラーをチェックし たい場合NULL

于 2013-10-26T18:05:37.060 に答える
1

ed 文字列fgets()を返すために繰り返し使用する関数を書くのは簡単ではないことがわかりました。malloc()

この関数は適切なエラー報告を行いません。realloc()またはを使用してエラーが発生した場合、それfgets()までに取得したデータが返されます。

これらとは別に、この機能は非常に使いやすいことがわかりました。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

char * read_one_line(FILE * in)
{
    size_t alloc_length = 64;
    size_t cumulength = 0;
    char * data = malloc(alloc_length);
    while (1) {
        char * cursor = data + cumulength; // here we continue.
        char * ret = fgets(cursor, alloc_length - cumulength, in);
        printf("r %p %p %zd %zd %zd\n", data, cursor, cumulength, alloc_length, alloc_length - cumulength);
        if (!ret) {
            // Suppose we had EOF, no error.
            // we just return what we read till now...
            // there is still a \0 at cursor, so we are fine.
            break;
        }
        size_t newlength = strlen(cursor); // how much is new?
        cumulength += newlength; // add it to what we have.
        if (cumulength < alloc_length - 1 || data[cumulength-1] == '\n') {
            // not used the whole buffer... so we are probably done.
            break;
        }
        // we need more!
        // At least, probably.
        size_t newlen = alloc_length * 2;
        char * r = realloc(data, newlen);
        printf("%zd\n", newlen);
        if (r) {
            data = r;
            alloc_length = newlen;
        } else {
            // realloc error. Return at least what we have...
            // TODO: or better free and return NULL?
            return data;
        }
    }
    char * r = realloc(data, cumulength + 1);
    printf("%zd\n", cumulength + 1);
    return r ? r : data; // shrinking should always have succeeded, but who knows?
}

int main()
{
    char * p = read_one_line(stdin);
    printf("%p\t%zd\t%zd\n", p, malloc_usable_size(p), strlen(p));
    printf("%s\n", p);
    free(p);
}
于 2013-10-26T19:00:27.987 に答える
1

fgets( input, 40, stdin );

input文字数が 40 以下であることが保証されています (null 終端を含む)

チェックを実行する必要はありません。

のサイズを取得するには、常に関数 oninputを使用できます。生成される文字列は常に null で終了するためです。strlen()inputfgets

于 2013-10-26T17:54:28.380 に答える