C从标准输入中读取行
我的目标是使用getline()函数读取piped.txt文件中的每一行,但每次使用此函数时,我都会遇到一个错误:C从标准输入中读取行,c,pipe,C,Pipe,我的目标是使用getline()函数读取piped.txt文件中的每一行,但每次使用此函数时,我都会遇到一个错误: #include <stdio.h> #include <string.h> #include <stdlib.h> int main() { int Chars; int size = 10; char *string; printf("Please enter a string: "); strin
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
int Chars;
int size = 10;
char *string;
printf("Please enter a string: ");
string = (char*) malloc(size);
Chars = getline(&string, &size, stdin);
if (Chars == -1)
{
puts("ERROR!");
}
else
{
puts("You entered the following string: ");
puts(string);
printf("\nCurrent size for string block: %d", Chars);
}
return 0;
}
#包括
#包括
#包括
int main(){
int字符;
int size=10;
字符*字符串;
printf(“请输入字符串:”);
字符串=(字符*)malloc(大小);
Chars=getline(&string,&size,stdin);
如果(字符==-1)
{
放置(“错误!”);
}
其他的
{
puts(“您输入了以下字符串:”);
放置(字符串);
printf(“\n字符串块的当前大小:%d”,字符);
}
返回0;
}
我总是得到错误代码:[Error]Id retruned 1 exit status我在DevC++上重现了链接错误,其中
getline()
似乎丢失了,即使在使用gcc编译器选项(如-std=c11
强制执行最新的C修订之后
因此,我使用fgets()
重写了您的代码:
它肯定比getline
更具可移植性,但有一些区别:
- 如果在该限制之前未遇到换行符,则它最多读取
个字符(它会自动附加字符串终止符)。所以它不能管理缓冲区的重新分配size-1
- 如果找到,则结果字符串包含
字符'\n'
#包括
#包括
#包括
#定义最大长度为32
内部主(空)
{
int len=0;
char*str;
printf(“请输入字符串:”);
str=malloc(最大str尺寸);/*(1)*/
而(1)
{
大小新线位置;
fgets(str、最大str、标准尺寸);
/* (2) */
如果(len==0)/*(3)*/
{
puts(“您输入了以下字符串:”);
}
换行符位置=strcspn(str,“\n”);
str[newline_pos]='\0';
len+=strlen(str);/*(4)*/
fput(str、stdout);
如果(换行位置<最大长度尺寸-1)/*(5)*/
打破
}
printf(“\n\n字符串块的当前大小:%d”,len);
自由(str);/*(6)*/
返回0;
}
因此,基本上,我只是使用fgets
读取stdin
,迭代直到找到'\n'
字符。为了理解这个条件是否满足,我使用函数,并使用相同的函数从结果字符串中删除换行符
一些注释/假设(检查代码部分中的相应数字):
<> LIQue:C++编译时,只需要编译<代码> MALLC/<代码>的结果。它可以在C中省略
fgets
错误检查:出错时返回NULL(在找到EOF之前没有读取字符。从stdin读取时不会发生)len==0
我们确保您输入的字符串:“
仅打印一次'\n'
时,满足中断
条件。否则,strcspn
的返回值将为MAX\u STR\u SIZE
释放它是一个好习惯
我在DevC++上重现了链接错误,其中
getline()
似乎丢失了,即使在使用gcc编译器选项(如-std=c11
强制执行最新的C修订版后也是如此
因此,我使用fgets()
重写了您的代码:
它肯定比getline
更具可移植性,但有一些区别:
- 如果在该限制之前未遇到换行符,则它最多读取
个字符(它会自动附加字符串终止符)。所以它不能管理缓冲区的重新分配size-1
- 如果找到,则结果字符串包含
字符'\n'
#包括
#包括
#包括
#定义最大长度为32
内部主(空)
{
int len=0;
char*str;
printf(“请输入字符串:”);
str=malloc(最大str尺寸);/*(1)*/
而(1)
{
大小新线位置;
fgets(str、最大str、标准尺寸);
/* (2) */
如果(len==0)/*(3)*/
{
puts(“您输入了以下字符串:”);
}
换行符位置=strcspn(str,“\n”);
str[newline_pos]='\0';
len+=strlen(str);/*(4)*/
fput(str、stdout);
如果(换行位置<最大长度尺寸-1)/*(5)*/
打破
}
printf(“\n\n字符串块的当前大小:%d”,len);
自由(str);/*(6)*/
返回0;
}
因此,基本上,我只是使用fgets
读取stdin
,迭代直到找到'\n'
字符。为了理解这个条件是否满足,我使用函数,并使用相同的函数从结果字符串中删除换行符
一些注释/假设(检查代码部分中的相应数字):
<> LIQue:C++编译时,只需要编译<代码> MALLC/<代码>的结果。它可以在C中省略
fgets
错误检查:出错时返回NULL(在找到EOF之前没有读取字符。从stdin读取时不会发生)len==0
我们确保您输入的字符串:“
仅打印一次'\n'
时,满足中断
条件。否则,strcspn
的返回值将为MAX\u STR\u SIZE
释放它是一个好习惯
getline不是C标准函数。不要使用
getline
,它是非标准函数,而是使用fgets
。您的平台(OS/compiler/IDE/…)是什么?注意:1)我想size
应该是size\u tchar *fgets(char *s, int size, FILE *stream);
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_STR_SIZE 32
int main( void )
{
int len = 0;
char *str;
printf("Please enter a string: ");
str = malloc(MAX_STR_SIZE); /* (1) */
while( 1 )
{
size_t newline_pos;
fgets( str, MAX_STR_SIZE, stdin );
/* (2) */
if( len == 0) /* (3) */
{
puts("You entered the following string: ");
}
newline_pos = strcspn(str, "\n" );
str[newline_pos] = '\0';
len += strlen(str); /* (4) */
fputs(str, stdout);
if(newline_pos < MAX_STR_SIZE-1) /* (5) */
break;
}
printf("\n\nCurrent size for string block: %d", len);
free( str ); /* (6) */
return 0;
}