Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.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 如何使用fgets()读取标准数据?_C_Stdin_Fgets - Fatal编程技术网

C 如何使用fgets()读取标准数据?

C 如何使用fgets()读取标准数据?,c,stdin,fgets,C,Stdin,Fgets,我编写了以下代码来读取终端窗口中的一行,问题是代码陷入了无限循环。行/句子的长度未定义,因此我计划将其部分读入缓冲区,然后将其连接到另一个字符串,该字符串可以通过realloc相应地扩展。请有人能指出我的错误或提出一个更好的方法来实现这一点 #include <stdio.h> #include <string.h> #define BUFFERSIZE 10 int main (int argc, char *argv[]) { char buffer[BU

我编写了以下代码来读取终端窗口中的一行,问题是代码陷入了无限循环。行/句子的长度未定义,因此我计划将其部分读入缓冲区,然后将其连接到另一个字符串,该字符串可以通过
realloc
相应地扩展。请有人能指出我的错误或提出一个更好的方法来实现这一点

#include <stdio.h>
#include <string.h>

#define BUFFERSIZE 10

int main (int argc, char *argv[])
{
    char buffer[BUFFERSIZE];
    printf("Enter a message: \n");
    while(fgets(buffer, BUFFERSIZE , stdin) != NULL)
    {
        printf("%s\n", buffer);
    }
    return 0;
}
#包括
#包括
#定义缓冲区大小10
int main(int argc,char*argv[])
{
字符缓冲区[BUFFERSIZE];
printf(“输入消息:\n”);
while(fgets(buffer,BUFFERSIZE,stdin)!=NULL)
{
printf(“%s\n”,缓冲区);
}
返回0;
}

您对fgets返回的内容有错误的认识。看看这个:

当它找到EOF字符时返回null。试着运行上面的程序并按CTRL+D(或者你的EOF字符的任何组合),循环将成功退出


您希望如何检测输入的结束?新线?点(你说的是句子xD)

假设你只想读一行,然后使用
中定义的
line\u MAX

#包括
#包括
...
字符行[line_MAX];
...
如果(fgets(行、行最大值、标准输入)!=NULL){
...
}
...

这里有一个串联解决方案:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFERSIZE 10

int main() {
  char *text = calloc(1,1), buffer[BUFFERSIZE];
  printf("Enter a message: \n");
  while( fgets(buffer, BUFFERSIZE , stdin) ) /* break with ^D or ^Z */
  {
    text = realloc( text, strlen(text)+1+strlen(buffer) );
    if( !text ) ... /* error handling */
    strcat( text, buffer ); /* note a '\n' is appended here everytime */
    printf("%s\n", buffer);
  }
  printf("\ntext:\n%s",text);
  return 0;
}
#包括
#包括
#包括
#定义缓冲区大小10
int main(){
char*text=calloc(1,1),buffer[BUFFERSIZE];
printf(“输入消息:\n”);
while(fgets(buffer,BUFFERSIZE,stdin))/*用^D或^Z中断*/
{
text=realloc(text,strlen(text)+1+strlen(buffer));
如果(!text)../*错误处理*/
strcat(文本,缓冲区);/*注意每次此处都会附加一个“\n”*/
printf(“%s\n”,缓冲区);
}
printf(“\n文本:\n%s”,文本);
返回0;
}

如果要连接输入,请替换
printf(“%s\n”,buffer)带有
strcat(大缓冲区,缓冲区)。还要在开头创建并初始化大缓冲区:
char*big_buffer=new char[big_BUFFERSIZE]
big_buffer[0]='\0'。您还应该通过验证当前缓冲区长度加上新缓冲区长度不超过限制来防止缓冲区溢出:
如果((strlen(big\u buffer)+strlen(buffer))
。修改后的程序如下所示:

#include <stdio.h>
#include <string.h>

#define BUFFERSIZE 10
#define BIG_BUFFERSIZE 1024

int main (int argc, char *argv[])
{
    char buffer[BUFFERSIZE];
    char *big_buffer = new char[BIG_BUFFERSIZE];
    big_buffer[0] = '\0';
    printf("Enter a message: \n");
    while(fgets(buffer, BUFFERSIZE , stdin) != NULL)
    {
        if ((strlen(big_buffer) + strlen(buffer)) < BIG_BUFFERSIZE)
        {
            strcat(big_buffer, buffer);
        }
    }
    return 0;
}
#包括
#包括
#定义缓冲区大小10
#定义大缓冲区大小1024
int main(int argc,char*argv[])
{
字符缓冲区[BUFFERSIZE];
char*big_buffer=新字符[big_BUFFERSIZE];
大缓冲区[0]='\0';
printf(“输入消息:\n”);
while(fgets(buffer,BUFFERSIZE,stdin)!=NULL)
{
if((strlen(大缓冲)+strlen(缓冲))
如果行为空,则退出循环(改进代码)

#包括
#包括
//BUFFERSIZE的值可以根据客户的喜好进行更改。改变
//基本数组的大小(字符串缓冲区)
#定义缓冲区大小10
内部主(空)
{
字符缓冲区[BUFFERSIZE];
炭炭;
printf(“输入消息:\n”);
while(*(fgets(buffer,BUFFERSIZE,stdin))!='\n')
{
//用于串联
//fgets读取并在字符串中添加“\n”,将“\n”替换为“\0”以
//拆下断线。
/*if(buffer[strlen(buffer)-1]=='\n')
缓冲区[strlen(buffer)-1]='\0'*/
printf(“%s”,缓冲区);
//修正了Alain BECKER提到的错误。
//检查字符串缓冲区是否已满,以检查并防止
//fgets读取的下一个字符是“\n”。
if(strlen(buffer)=(BUFFERSIZE-1)&(buffer[strlen(buffer)-1]!='\n'))
{
//防止在第一行中读取行“\n”的结尾
//下一个循环中的字符(循环出口)。读取
//如果读取并删除了'\n',如果
//将不同的数据返回给stdin
cChar=fgetc(标准偏差);
如果(cChar!='\n')
ungetc(cChar、stdin);
//如果删除了“\n”,则无法正确打印。
其他的
printf(“\n”);
}
}
返回0;
}
按Enter键时退出

#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <assert.h>

#define BUFFERSIZE 16

int main(void)
{
    char buffer[BUFFERSIZE];
    printf("Enter a message: \n");
    while(true)
    {
        assert(fgets(buffer, BUFFERSIZE, stdin) != NULL);
        // Verifies that the previous character to the last character in the
        // buffer array is '\n' (The last character is '\0') if the
        // character is '\n' leaves loop.
        if(buffer[strlen(buffer) - 1] == '\n')
        {
            // fgets reads and adds '\n' in the string, replace '\n' by '\0' to 
            // remove the line break .
            buffer[strlen(buffer) - 1] = '\0';
            printf("%s", buffer);
            break;
        }
        printf("%s", buffer);   
    }
    return 0;
}
#包括
#包括
#包括
#包括
#定义缓冲区大小16
内部主(空)
{
字符缓冲区[BUFFERSIZE];
printf(“输入消息:\n”);
while(true)
{
断言(fgets(buffer,BUFFERSIZE,stdin)!=NULL);
//验证前一个字符是否为中的最后一个字符
//如果
//字符为“\n”将离开循环。
if(buffer[strlen(buffer)-1]=='\n')
{
//fgets读取并在字符串中添加“\n”,将“\n”替换为“\0”以
//拆下断线。
缓冲区[strlen(buffer)-1]='\0';
printf(“%s”,缓冲区);
打破
}
printf(“%s”,缓冲区);
}
返回0;
}
连接和dinamic分配(链表)到单个字符串

/* Autor : Tiago Portela
   Email : sapitando@gmail.com
   Sobre : Compilado com TDM-GCC 5.10 64-bit e LCC-Win32 64-bit;
   Obs : Apenas tentando aprender algoritimos, sozinho, por hobby. */

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <assert.h>

#define BUFFERSIZE 8

typedef struct _Node {
    char *lpBuffer;
    struct _Node *LpProxNode;
} Node_t, *LpNode_t;

int main(void)
{
    char acBuffer[BUFFERSIZE] = {0};
    LpNode_t lpNode = (LpNode_t)malloc(sizeof(Node_t));
    assert(lpNode!=NULL);
    LpNode_t lpHeadNode = lpNode;
    char* lpBuffer = (char*)calloc(1,sizeof(char));
    assert(lpBuffer!=NULL);
    char cChar;


    printf("Enter a message: \n");
    // Exit when Enter is pressed
/*  while(true)
    {
        assert(fgets(acBuffer, BUFFERSIZE, stdin)!=NULL);
        lpNode->lpBuffer = (char*)malloc((strlen(acBuffer) + 1) * sizeof(char));
        assert(lpNode->lpBuffer!=NULL);
        strcpy(lpNode->lpBuffer, acBuffer);
        if(lpNode->lpBuffer[strlen(acBuffer) - 1] == '\n')
        {
            lpNode->lpBuffer[strlen(acBuffer) - 1] = '\0';
            lpNode->LpProxNode = NULL;
            break;
        }
        lpNode->LpProxNode = (LpNode_t)malloc(sizeof(Node_t));
        lpNode = lpNode->LpProxNode;
        assert(lpNode!=NULL);
    }*/

    // Exits the loop if the line is empty(Improving code).
    while(true)
    {
        assert(fgets(acBuffer, BUFFERSIZE, stdin)!=NULL);
        lpNode->lpBuffer = (char*)malloc((strlen(acBuffer) + 1) * sizeof(char));
        assert(lpNode->lpBuffer!=NULL);
        strcpy(lpNode->lpBuffer, acBuffer);
        if(acBuffer[strlen(acBuffer) - 1] == '\n')
            lpNode->lpBuffer[strlen(acBuffer) - 1] = '\0';
        if(strlen(acBuffer) == (BUFFERSIZE - 1) && (acBuffer[strlen(acBuffer) - 1] != '\n'))
        {
            cChar = fgetc(stdin);
            if(cChar != '\n')
                ungetc(cChar, stdin);
        }
        if(acBuffer[0] == '\n')
        {
            lpNode->LpProxNode = NULL;
            break;
        }
        lpNode->LpProxNode = (LpNode_t)malloc(sizeof(Node_t));
        lpNode = lpNode->LpProxNode;
        assert(lpNode!=NULL);
    }


    printf("\nPseudo String :\n");
    lpNode = lpHeadNode;
    while(lpNode != NULL)
    {
        printf("%s", lpNode->lpBuffer);
        lpNode = lpNode->LpProxNode;
    }


    printf("\n\nMemory blocks:\n");
    lpNode = lpHeadNode;
    while(lpNode != NULL)
    {
        printf("Block \"%7s\" size = %lu\n", lpNode->lpBuffer, (long unsigned)(strlen(lpNode->lpBuffer) + 1));
        lpNode = lpNode->LpProxNode;
    }


    printf("\nConcatenated string:\n");
    lpNode = lpHeadNode;
    while(lpNode != NULL)
    {
        lpBuffer = (char*)realloc(lpBuffer, (strlen(lpBuffer) + strlen(lpNode->lpBuffer)) + 1);
        strcat(lpBuffer, lpNode->lpBuffer);
        lpNode = lpNode->LpProxNode;
    }
    printf("%s", lpBuffer);
    printf("\n\n");

    // Deallocate memory
    lpNode = lpHeadNode;
    while(lpNode != NULL)
    {
        lpHeadNode = lpNode->LpProxNode;
        free(lpNode->lpBuffer);
        free(lpNode);
        lpNode = lpHeadNode;
    }
    lpBuffer = (char*)realloc(lpBuffer, 0);
    lpBuffer = NULL;
    if((lpNode == NULL) && (lpBuffer == NULL))
    {

        printf("Deallocate memory = %s", (char*)lpNode);
    }
    printf("\n\n");

    return 0;
}
/*Autor:Tiago Portela
电邮:sapitando@gmail.com
Sobre:CompileADO com TDM-GCC 5.10 64位e LCC-Win32 64位;
Obs:Apenas tentando aprender algoritimos,sozinho,por hobby*/
#包括
#包括
#包括
#包括
#包括
#定义缓冲区大小8
类型定义结构节点{
字符*lpBuffer;
结构节点*LpProxNode;
}Node_t,*LpNode_t;
内部主(空)
{
char acBuffer[BUFFERSIZE]={0};
LpNode_t LpNode=(LpNode_t)malloc(sizeof(Node_t));
断言(lpNode!=NULL);
LpNode\u t lpHeadNode=LpNode;
char*lpBuffer=(char*)calloc(1,sizeof(char));
断言(lpBuffer!=NULL);
炭炭;
printf(“输入消息:\n”);
//按Enter键时退出
/*while(true)
{
断言(fgets(acBuffer,BUFFERSIZE,stdin)!=NULL);
lpNode->lpBuffer=(char*)malloc((strlen(acBuffer)+1
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <assert.h>

#define BUFFERSIZE 16

int main(void)
{
    char buffer[BUFFERSIZE];
    printf("Enter a message: \n");
    while(true)
    {
        assert(fgets(buffer, BUFFERSIZE, stdin) != NULL);
        // Verifies that the previous character to the last character in the
        // buffer array is '\n' (The last character is '\0') if the
        // character is '\n' leaves loop.
        if(buffer[strlen(buffer) - 1] == '\n')
        {
            // fgets reads and adds '\n' in the string, replace '\n' by '\0' to 
            // remove the line break .
            buffer[strlen(buffer) - 1] = '\0';
            printf("%s", buffer);
            break;
        }
        printf("%s", buffer);   
    }
    return 0;
}
/* Autor : Tiago Portela
   Email : sapitando@gmail.com
   Sobre : Compilado com TDM-GCC 5.10 64-bit e LCC-Win32 64-bit;
   Obs : Apenas tentando aprender algoritimos, sozinho, por hobby. */

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <assert.h>

#define BUFFERSIZE 8

typedef struct _Node {
    char *lpBuffer;
    struct _Node *LpProxNode;
} Node_t, *LpNode_t;

int main(void)
{
    char acBuffer[BUFFERSIZE] = {0};
    LpNode_t lpNode = (LpNode_t)malloc(sizeof(Node_t));
    assert(lpNode!=NULL);
    LpNode_t lpHeadNode = lpNode;
    char* lpBuffer = (char*)calloc(1,sizeof(char));
    assert(lpBuffer!=NULL);
    char cChar;


    printf("Enter a message: \n");
    // Exit when Enter is pressed
/*  while(true)
    {
        assert(fgets(acBuffer, BUFFERSIZE, stdin)!=NULL);
        lpNode->lpBuffer = (char*)malloc((strlen(acBuffer) + 1) * sizeof(char));
        assert(lpNode->lpBuffer!=NULL);
        strcpy(lpNode->lpBuffer, acBuffer);
        if(lpNode->lpBuffer[strlen(acBuffer) - 1] == '\n')
        {
            lpNode->lpBuffer[strlen(acBuffer) - 1] = '\0';
            lpNode->LpProxNode = NULL;
            break;
        }
        lpNode->LpProxNode = (LpNode_t)malloc(sizeof(Node_t));
        lpNode = lpNode->LpProxNode;
        assert(lpNode!=NULL);
    }*/

    // Exits the loop if the line is empty(Improving code).
    while(true)
    {
        assert(fgets(acBuffer, BUFFERSIZE, stdin)!=NULL);
        lpNode->lpBuffer = (char*)malloc((strlen(acBuffer) + 1) * sizeof(char));
        assert(lpNode->lpBuffer!=NULL);
        strcpy(lpNode->lpBuffer, acBuffer);
        if(acBuffer[strlen(acBuffer) - 1] == '\n')
            lpNode->lpBuffer[strlen(acBuffer) - 1] = '\0';
        if(strlen(acBuffer) == (BUFFERSIZE - 1) && (acBuffer[strlen(acBuffer) - 1] != '\n'))
        {
            cChar = fgetc(stdin);
            if(cChar != '\n')
                ungetc(cChar, stdin);
        }
        if(acBuffer[0] == '\n')
        {
            lpNode->LpProxNode = NULL;
            break;
        }
        lpNode->LpProxNode = (LpNode_t)malloc(sizeof(Node_t));
        lpNode = lpNode->LpProxNode;
        assert(lpNode!=NULL);
    }


    printf("\nPseudo String :\n");
    lpNode = lpHeadNode;
    while(lpNode != NULL)
    {
        printf("%s", lpNode->lpBuffer);
        lpNode = lpNode->LpProxNode;
    }


    printf("\n\nMemory blocks:\n");
    lpNode = lpHeadNode;
    while(lpNode != NULL)
    {
        printf("Block \"%7s\" size = %lu\n", lpNode->lpBuffer, (long unsigned)(strlen(lpNode->lpBuffer) + 1));
        lpNode = lpNode->LpProxNode;
    }


    printf("\nConcatenated string:\n");
    lpNode = lpHeadNode;
    while(lpNode != NULL)
    {
        lpBuffer = (char*)realloc(lpBuffer, (strlen(lpBuffer) + strlen(lpNode->lpBuffer)) + 1);
        strcat(lpBuffer, lpNode->lpBuffer);
        lpNode = lpNode->LpProxNode;
    }
    printf("%s", lpBuffer);
    printf("\n\n");

    // Deallocate memory
    lpNode = lpHeadNode;
    while(lpNode != NULL)
    {
        lpHeadNode = lpNode->LpProxNode;
        free(lpNode->lpBuffer);
        free(lpNode);
        lpNode = lpHeadNode;
    }
    lpBuffer = (char*)realloc(lpBuffer, 0);
    lpBuffer = NULL;
    if((lpNode == NULL) && (lpBuffer == NULL))
    {

        printf("Deallocate memory = %s", (char*)lpNode);
    }
    printf("\n\n");

    return 0;
}