如何读取输入字符串直到C中出现一个空行?

如何读取输入字符串直到C中出现一个空行?,c,C,首先,我不熟悉C语言的编码 我试图从用户那里读取一个未知大小的字符串,直到给出一个空行,然后将其保存到一个文件中,然后读取该文件 我只是设法做到这一点,直到有一个新的行,我不知道如何寻找一个空白行 #include <stdio.h> #include <stdlib.h> char *input(FILE* fp, size_t size) { char *str; int ch; size_t len = 0; str = reall

首先,我不熟悉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;
}
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);
}
#包括
#包括
字符*输入(文件*fp,大小\u t大小){
char*str;
int-ch;
尺寸长度=0;
str=realloc(空,sizeof(char)*大小);
如果(!str)返回str;
而(EOF!=(ch=fgetc(fp))&&ch!='\n'){
str[len++]=ch;
if(len==大小){
str=realloc(str,sizeof(char)*(size+=16));
如果(!str)返回str;
}
}
str[len++]='\0';
返回realloc(str,sizeof(char)*len);
}
int main(int argc,const char*argv[]{
字符*istr;
printf(“输入字符串:”);
istr=输入(标准输入,10);
//写入文件
文件*fp;
fp=fopen(“1.txt”,“w+”);
fprintf(fp,istr);
fclose(fp);
//读取文件
字符c;
fp=fopen(“1.txt”,“r”);
而((c=fgetc(fp))!=EOF){
printf(“%c”,c);
}
printf(“\n”);
fclose(fp);
免费(istr);
返回0;
}

谢谢

为什么不使用标志或计数器呢。对于计数器,只需增加找到的每个字符的计数器。如果找到新行且计数器为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;
    }
}

为什么不用旗子或计数器呢。对于计数器,只需增加找到的每个字符的计数器。如果找到新行且计数器为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个字符。如果它们是
'\n'
,则您检测到一个空行:第一个
'\n'
是前一行的结尾,第二个是当前行(这是一个空行)的结尾

请注意,
ch!='\n'和&prev_ch!='\n'
是为了让情况更容易理解


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

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

请注意,
ch!='\n'和&prev_ch!='\n'
是为了让情况更容易理解


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

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

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

如果空行的概念包括
“\n”
(带前缀的空格),则编写一个函数
is_only_spaces()
,该函数为类似的字符串返回一个真值


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

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

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

如果空行的概念包括
“\n”
(带前缀的空格),则编写一个函数
is_only_spaces()
,该函数为类似的字符串返回一个真值


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

EOF
不能存储在
char
中,因此存储从
fgetc()
返回的内容的
c
类型应该是
int
@MikeCAT你是认真的吗?在大多数系统(-1)上不是
EOF
?有符号的
char
可以存储-128到-128之间的值127@layzak对从
fgetc()
返回的字符范围为
无符号字符
。转换<代码> EOF 以适应<代码> char < /代码>不是一个好主意,因为它将无法区分一个可能的字符和<代码> EOF。如果<代码> ReloLC/<代码>失败,则泄漏内存。您认为“新行”和“空白行”之间的区别是什么?<代码> EOF <代码>不能存储在<代码> char < /代码>中,因此存储从
fgetc()
返回的内容的
c
类型应该是
int
@MikeCAT你是认真的吗?在大多数系统(-1)上不是
EOF
?有符号的
char
可以存储-128到-128之间的值127@layzak对从
fgetc返回的字符(