Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C从标准输入中读取行_C_Pipe - Fatal编程技术网

C从标准输入中读取行

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

我的目标是使用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: ");
  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;
    }