如何读取输入字符串直到C中的空行?

时间:2016-06-03 16:15:22

标签: c

首先,我是C的新编码。

我试图从用户那里读取一串未知大小,直到给出一个空白行,然后将其保存到文件中,然后读取该文件。

我只是设法做到这一点,直到给出新的一行,我不知道如何寻找空白行。

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

char *input(FILE* fp, size_t size) {
    char *str;
    int ch;
    size_t len = 0;
    str = realloc(NULL, sizeof(char)*size);
    if (!str)return str;
    while (EOF != (ch = fgetc(fp)) && ch != '\n') {
        str[len++] = ch;
        if (len == size) {
            str = realloc(str, sizeof(char)*(size += 16));
            if (!str)return str;
        }
    }
    str[len++] = '\0';

    return realloc(str, sizeof(char)*len);
}

int main(int argc, const char * argv[]) {
    char *istr;
    printf("input string : ");
    istr = input(stdin, 10);
    //write to file
    FILE *fp;
    fp = fopen("1.txt", "w+");
    fprintf(fp, istr);
    fclose(fp);

    //read file
    char c;
    fp = fopen("1.txt", "r");
    while ((c = fgetc(fp)) != EOF) {
         printf("%c", c);
    }

    printf("\n");
    fclose(fp);

    free(istr);
    return 0;
}

谢谢!

3 个答案:

答案 0 :(得分:2)

我会重新调整你的代码。我会将您的input()函数更改为读取单行的函数(readline()?)。在main()中,我会通过readline()逐行循环阅读。

如果该行为空(只有一个换行符 - 使用strcmp(istr, "\n")),则释放指针,然后退出循环。否则将该行写入文件并释放指针。

如果您的空行概念包含" \n"(前缀空格),则编写一个函数is_only_spaces(),该函数返回一个类似于该字符串的真值。

虽然你可以处理input()中的空行,但是从输入终止条件中提取行读数是有价值的。

答案 1 :(得分:1)

为什么不使用旗帜或柜台。对于计数器,您可以简单地增加每个字符找到的计数器。如果找到新行并且计数器为0,则它​​必须是空行。如果找到一个换行符并且计数器不为0,则它​​必须是该行的结尾,因此将计数器重置为0并继续。

这样的事情:

int count = 0;
while ((ch = fgetc(fp)) != EOF)
{
    if(ch == '\n')
    {
        if(count == 0)
        {
            break;
        }
        count = 0;
        str[len++] = ch;
    }
    else
    {
        str[len++] = ch;
        ch++;
    }
}

另一种方法是简单地检查字符串中的最后一个字符是否是新行。

while ((ch = fgetc(fp)) != EOF)
{
    if(ch == '\n' && str[len - 1] == '\n')
    {
        break;
    }
}

答案 2 :(得分:1)

空白行是仅包含换行符的行,对吗?所以你可以简单地保留你读的最后2个字符。如果它们是'\n',那么您检测到一个空行:第一个'\n'是前一行的结尾,第二个是当前行的结尾(这是一个空行)。

char *input(FILE* fp, size_t size) {
    char *str;
    int ch, prev_ch;
    size_t len = 0;
    str = realloc(NULL, sizeof(char)*size);
    if (!str)return str;
    while (EOF != (ch = fgetc(fp)) && (ch != '\n' && prev_ch != '\n')) {
        str[len++] = ch;
        if (len == size) {
            str = realloc(str, sizeof(char)*(size += 16));
            if (!str)return str;
        }
        prev_ch = ch;
    }
    str[len++] = '\0';

    return realloc(str, sizeof(char)*len);
}

请注意ch != '\n' && prev_ch != '\n'周围的括号是为了使条件更容易理解。

为了改善这一点,你可以保持你的函数只读取一行并测试返回的行是否为空(它只包含'\n')。