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 );

input保证字符数小于等于 40(包括空终止)

您不必执行检查。

并且为了获取大小,input您始终可以使用strlen()函数 on input,因为从中生成的字符串fgets始终为空终止。

于 2013-10-26T17:54:28.380 回答
1

没有任何功能可以做到,您需要自己编写。即,逐字节读取以查找EOF字符。但我猜你这样做是为了避免溢出,对吧?如果输入大于40字符,则不需要,因为保证这样的额外值不会被fgets()函数放入缓冲区,它永远不会大于您请求的大小:40。该值可能小于或等于,但从不大于。

编辑:

通过“如何在 C 中获得标准输入的长度?” 我在想你在谈论stdin. 我很抱歉。如果您想获取fgets()写入的字节数,只需使用strlen()

于 2013-10-26T17:59:09.527 回答
1

fgets( input, 40, stdin );

输入长度不应超过 40 个字符 == 39 个字符 + nul 字符

如果您给出的字符串长度超过 39 个字符,则fgets()读取前 39 个字符并放置nul character('\0')为 40 个字符并忽略剩余字符。

如果您给出的字符串少于 39 个字符,例如 5,那么它会将读取换行符的位置也变为 6(不包括 nul 字符)

不要忘记删除换行符。

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

例如,如果您声明输入缓冲区大小为 60,那么如果您想要对超过 40 个字符进行错误检查。

您可以简单地检查strlen()并检查长度是否超过 40.then 显示错误消息

如果您想通过检查来检查fgets()错误 NULL

于 2013-10-26T18:05:37.060 回答
1

事实证明,编写一个fgets()重复使用以返回malloc()ed 字符串的函数并不容易。

该函数没有正确报告错误:如果使用realloc()or发生错误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 回答