如何读取输入字符串直到C中出现一个空行?
首先,我不熟悉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
#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()
逐行循环阅读
如果该行为空(只有一个换行符--usestrcmp(istr,“\n”)
),则释放指针并退出循环。否则,将该行写入文件并释放指针
如果空行的概念包括“\n”
(带前缀的空格),则编写一个函数is_only_spaces()
,该函数为类似的字符串返回一个真值
虽然您可以在
input()
中处理空行,但从输入终止条件中提取行读数是有价值的。我会稍微重新构造您的代码。我会将您的input()
函数更改为读取单行的函数(readline()
?)。在main()
中,我会通过readline()
逐行循环阅读
如果该行为空(只有一个换行符--usestrcmp(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返回的字符(