精华内容
下载资源
问答
  • fgets不读入换行符

    千次阅读 2020-04-16 22:00:56
    #include <stdio.h> #include <string.h> char* s_gets(char* dest, int n) { char* ret_val = NULL; int i = 0; ret_val = fgets(dest, n, stdin); if (ret_val) { whi...
    #include <stdio.h>
    #include <string.h>
    
    char* s_gets(char* dest, int n)
    {
        char* ret_val = NULL;
        int i = 0;
    
        ret_val = fgets(dest, n, stdin);
        if (ret_val)
        {
            while (dest[i] != '\n' && dest[i] != '\0')
                i++;
    
            if (dest[i] == '\n')
            {
                dest[i] = '\0';
            }
            else
            {
                while (getchar() != '\n')
                    continue;
            }
        }
    
        return s_gets 
    }

    dest:字符串存储地址

    n:读入字符最大数量, 实际字符长度应为n - 1。 末尾1位空字符'\0'。

    内部调用fgets, 顺序读取字符串, 直到读取到换行符或空字符'\0'。

    if 读到换行符,替换成空字符'\0'。

    if 读到空字符, 舍弃剩下的字符。getchar只读取,不存储,知道读到换行符。

    展开全文
  • 之前的博客提到了怎样对长度不确定且无法估计的文本文件进行按行读取的问题,这次我发现了一个每一行的末尾换行符处理的问题以及fgets的一个特性,这都是我之前没有注意到的地方。 文章目录1.每行末尾换行符的处理...

    之前的博客提到了怎样对长度不确定且无法估计的文本文件进行按行读取的问题,这次我发现了一个每一行的末尾换行符处理的问题以及fgets的一个特性,这都是我之前没有注意到的地方。

    1.每行末尾换行符的处理

    首先,问题的导入在于我写的一个小程序。
    1.我在一个文本文件中打字,然后想用fgets读取第一行的内容2.我想再读取之后对数组进行打印来体现出换行符的存在3.发现问题。
    下面是文本文件的内容:
    infooftxt
    下面是控制台打印读取的内容。(我把数组初始化为’9’,为了视觉方便,每个字符两侧放上:)
    p2
    可以看到读取结果显示每行末尾存在着两个换行符。并且,那个空格字符是哪来的??

    1.1解释

    1.为什么有两个换行符?
    Windows系统下换行符是两个字符’\r’和’\n’,所以会换行两次
    2.空格哪来的??
    fgets会再读取结束后在输入流的末尾自动加上’\0’作为结束的标志,而打印’\0’字符就是一个空格。

    1.2代码

    下面是我写的代码,可以看一看,

    #include <stdio.h>
    #include <stdlib.h>
    
    #define filepath "e:info.txt"
    #define MAXLEN 100
    
    int main(void) {
        
        FILE *fp = fopen(filepath, "r");
        if (!fp) {printf("file open error!\n"); system("pause"); exit(0);}
    
        char target[16]; for (int i = 0; i < 16; ++i) target[i] = '9';
        fgets(target, 16, fp);
    
        for (int i = 0; i < 16; ++i)
            printf(":%c:\n", target[i]);
    
        system("pause");
        fclose(fp);
        return 0;
    
    }
    

    那么fgets真的会在流自动末尾加上’\0’吗?

    2.fgets末尾’\0’问题

    我们通过实际操作来验证,下面是代码:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define filepath "e:info.txt"
    #define MAXLEN 100
    
    int main(void) {
        
        
        char a[10];
        for (int i = 0; i < 10; ++i)
            a[i] = '1';
        
        fgets(a, 5, stdin);
    
        for (int i = 0; i < 10; ++i)
            printf(":%c:\n", a[i]);
    
        system("pause");
    
    
        return 0;
    
    }
    

    那么结果如何?

    2.1运行结果

    p3
    可以看到在我输入"afsv"之后fgets确实在末尾自动加上了’\0’,并且打印时体现为空格

    3.总结

    • Windows下换行符是\r\n连个字符,Linux下位\r
    • fgets会在输入流末尾自动加上’\0’
    • fgets函数原型为:char * fgets(char *restrict _Buf, int _MaxCount, FILE *restrict _File);但是fgets最多能接收的字符数量为(MaxCount - 1),这一点也要注意
    • fgets会吸收缓冲区中的回车符!!!并且这个回车符也会被解析为\r\n两个字符!!,这一个细节十分重要。图片展示:
      111
      可以看到缓冲区中存储着“ab\r\n",所以打印出这个结果并不奇怪。
    展开全文
  • void handleEnterAfterBuf(char buf[])//用于去除fgets读取数据中的\n { //在参数 buf所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置 将指针指向这个位置 char* find = strchr(buf, '\n'); //找出...
    void handleEnterAfterBuf(char buf[])//用于去除fgets读取数据中的\n
    {   //在参数 buf所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置 将指针指向这个位置
        char* find = strchr(buf, '\n');  //找出data中的"\n"
        if (find) //指针指向内容替换
            *find = '\0';   //替换  
    }
    
    
    //有时候fgets读取的内容最后可能为\r\n直接改为 *find='\r';
    
    展开全文
  • C中关于fgets()函数保存换行符的问题

    千次阅读 2020-05-23 10:58:46
    我们在使用fgets()函数中,如果我们对所得到的字符串和我们已知字符串用strcmp进行对比,使用如下: #include<stdio.h> #include <string.h> #define ANSWER "Grant" #define size 40 char* s_gets...

    我们在使用fgets()函数中,如果我们对所得到的字符串和我们已知字符串用strcmp进行对比,使用如下:

    #include<stdio.h>
    #include <string.h>
    
    #define ANSWER "Grant"
    #define size 40
    
    char* s_gets(char *st,int n);
    
    int main(void)
    {
    	char tr[size];
    
    	puts("who is buried in Grant's tomb");
    	fgets(tr, size, stdin);
    	printf("输入的字符数为:%d.", strlen(tr));
    	while (strcmp(tr,ANSWER)!=0)
    	{
    		puts("No, that's wrong. Try again");
    		fgets(tr, size, stdin);
    	}
    	puts("That's right.");
    
    	/*char words[num] ;
    	while (fgets(words,num,stdin)!=NULL&&words[0]!='\n')
    	{
    		fputs(words,stdout);
    	}*/
    	
    	return 0;
    
    }

    我们会发现不管我们输入什么即使是Grant,都会提示我们没有输入正确,我中间加入了一个打印输入字符长度的语句,运行结果总会比我们输入字符数多一个,那正好印证了fget()函数在输入字符串末尾保存了一个换行符。

    我们有以下两种修改,使得我们输入能与我们ANSWER匹配:

    1、修改我们的ANSWER,在字符串最后面手动添加一个'\n',#define ANSWER "Grant\n"

    这样我们就可输入匹配了。

    2、我们使用s_gets()函数,这个函数在之前没有介绍,因为VS编译器中并没有。这个函数和fgets()函数类似,但是将最后保存的换行符换成空字符。在这里也给出了s_gets()函数的具体代码:

    char* s_gets(char* st, int n)
    {
    	char* ret_val;
    	int i = 0;
    	
    	ret_val = fgets(st, n, stdin);
    	if (ret_val)
    	{
    		while (st[i] != '\n' && st[i] != '\0')
    			i++;
    		if (st[i]=='\n')
    		{
    			st[i] = '\0';
    		}
    		else
    		{
    			while (getchar()!='\n')
    			{
    				continue;
    			}
    		}
    	}
    	return ret_val;
    
    }

    使用s_gets()函数就解决了,fgets()函数自动在输入字字符串末尾保存换行符的尴尬了。

    展开全文
  • 今天在编写99乘法在线小游戏(看过我的 linux下c实现的数据库备份(第四版)应该知道我在那里提过^.^)的时候遇到读取文件的信息遇到回车换行符的烦恼。 比如我文件里面有如下信息: name=qizexi sex=man 我希望读取...
  • char line[80]; char * find; fgets(line, 80, stdin); find = strchr(line, '\n'); //查找换行符 if(find) //如果find不为空指针 find = '\0';
  • 摘要:C语言中,我们常常从终端输入,并且输出到终端,键盘上的回车,输入到缓冲区以后,变成了什么... 另外,如果从终端读取一个字符串,gets把最后的换行符\n换成\0,而fgets从stdin读入的时候,不会对\n进行处理。
  • 我正在尝试创建一个使用PHP‘fgets’函数从平面文件数据库调用图像名称的库.图库中有不同的部分,每个...它完全按照我的意愿工作,只有一个小故障:它将行尾的换行符复制到行上的字符,打破了Javascript.违规代码:fu...
  • 思路:50列数据,0~49,文件最后一个字符为换行符,然后是'\0'保存在map数组中 我们想要fgets函数,该函数会读取换行符且不会自动去掉. 所以我们读入的一行的字符总数一共是52个(这里最后一个'\0'要算在内部),倒数第一个...
  • string fgets ( int $handle...碰到换行符(包括在返回值中)、EOF 或者已经读取了 length - 1 字节后停止(看先碰到那一种情况)。如果没有指定 length,则默认为 1K,或者说 1024 字节。实际使用中:fgets()经常和whil...
  • 如果用fgets输入字符串,是不是比字符串本身长度多一位(因为\0前面有一个\n)? 使用gets是不是就不会这样,但是gets不安全 如何解决这个问题啊
  • char *fgets(char*str,intn,FILE*stream);The fgets function readsa string from the input stream argument and stores itin str. fgets reads characters from thecurrent stream position to and incl...
  • fgets读入包括换行符

    千次阅读 2009-05-15 19:13:00
    linux: #include #include #define size 129int main(){ char a[size],b[size],c[size]="abc"; int i,j,al,bl,cl,ctemp; // printf(" /nInput a string a :/n"); fgets(a,size,stdin); // pr
  • Below is a fast approach to remove a potential '\n' from a string saved by fgets().It uses strlen(), with 2 tests.char buffer[100];if (fgets(buffer, sizeof buffer, stdin) != NULL) {size_t len = strlen...
  • 上篇文章也提到,fgets会读取回车换行符的。有时候我们并不希望在字符串中存在换行符。有的时候我们在一行中多输入了几个字符,而这几个字符并不是我们想要的。这时可以写一个小程序解决这个问题 下面看程序...
  • fgets函数用于读取指定文件中的一,其函数原型为:char * fgets(char * s, int n,FILE *stream); 参数s:将读取存入字符型指针s指向的地址 参数n:读取n-1个字符 参数stream:从文件指针stream所指位置的文件...
  • popen后用fgets读数据的问题u0134018532832019-04-15linux c之用fopen、fputs、fgets、 fseek来对文件进行写、替换、读u01106870254922017-01-09fgets()逐行读取文件内容libing_zeng15352017-03-10c/c++读取可以...
  • linux下fgets到的字符串去掉换行符代码如下,报段错误了,帮看下,哪里有错误。。。。#include#include#include//思路把\n去掉,最后最后一行不含\nintdel_str_line(char*str){char*p=str;while('\n'!=*p){p++;if(*p...
  • 然而,C语言有fgets()函数,该函数返回string类型,关键是该函数遇到换行符或EOF,则读取结束。利用这一特点,我们可以设置n为适当的缓冲区大小,即可以实现按行读取。char *fgets( char *string, int ...
  • fgets函数不会自动丢弃换行符\n 改进函数: char *Is_ip6Get(char *is_ip6, char *hostname){ FILE *fp = NULL; char temp[512]; char path[1024]; int len = 0; sprintf(path, "%s%s", IS_IP6, hostname); ...
  • char a[10]; fgets(a,sizeof(a),...=sizeof(a)-1) //需要考虑要读的数据太长没读完的情况. a[strlen(a)-1]='\0'; char line[1024] = ""; fgets(line, 1024, stdin); if (line[strlen(line)-1] == '\n'
  • fgets读取如何换行呢

    2021-05-22 09:51:38
    fgets读取怎么换行呢?本帖最后由 Smilencetion 于 2012-02-27 17:28:14 编辑程序接受两个命令行参数,第一个是一个字符,第二个是文件名要求程序只打印文件中包含给定字符的那些#include#include#defineMAX256int...
  • C语言中换行符问题

    2021-05-20 14:43:10
    在缓冲输入中,换行符的确是个麻烦的问题,在这里做一个总结。1.getchar()记住:getchar()函数 读取每...这里出现输入一个n,但是出现两句“Well……”原因是因为换行符也被传输进去了。换行符当然不等于’y’,所...
  • #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() { char *filename = "E://darknet-master-cpu/build/ceshi.txt";... //每最大读取的字符数 fp = fopen(filename, "r");
  • 然而他们还是有些不用的,我在从文件中用fgets读取一个Key,然后去查找这个Key对应的数据时发现死活找不到,但吊诡的是当我把数据全部打印出来我可以看到Key和它一样的数据,为什么查找这个Key没用呢?这个坑...
  • c语言中的换行符怎么打

    千次阅读 2021-05-20 12:37:36
    2016-08-12 15:54辛国海 客户经理C语言中回车,换行,空字符与空格:fgets和gets在读取换行符的区别摘要:C语言中,我们常常从终端输入,并且输出到终端,键盘上的回车,输入到缓冲区以后,变成了什么字符?...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,795
精华内容 5,118
关键字:

fgets会读取换行符吗