//getline函数:将一行读入到S中并返回其长度
int getline(char s[] ,int length)
{
int c,i;
for(i=0; i<length-1 && (c=getchar())!=EOF && c!='\n';++i)
s[i]=c;
if(c == '\n'){
s[i] = c;
++i;
}
s[i]='\0';
return i;
}
我想问一下,这里的if(c =='\n')有什么用?我觉得加上它反而错了。请知道的大牛告诉我一下,这是为什么?谢谢!
s[i]=c多余
这段代码去掉输入的回车
没错,注意for循环范围
int getline(char s[] ,int length)
{
int c,i;
for(i=0; i<length-1 && (c=getchar())!=EOF && c!='\n';++i)
s[i]=c;
===因为没有大括号,for循环到这里就结束了
if(c == '\n'){//判断输入的最后一次字符是不是"\n",如果是加上"\n",如果不是,则for循环已经处理了。
s[i] = c;
++i;
}
s[i]='\0';
return i;
}
这证明getline函数读取一行时将‘\n’字符也读进去数组里面了
//表示存取所有你输入的非EOF(Ctrl+z)和\n字符
for(i=0; i<length-1 && (c=getchar())!=EOF && c!='\n';++i){
s[i]=c;
}//最好加上花括号
if(c == '\n'){
s[i] = c;
++i;
}
表示你最后的输入是\n的话,说明一行输入结束,需要把\n存到数组(表示一行数据),最后加上\0(字符串结束符),这样就存储了一行数据,
如果输入的是最后的输入不是\n而是EOF的话,说明是自己异常终止了这个,注意这不是一行正常的数据。
你的主要函数功能很明确,如函数name:getline( ),从终端读取一行字符数据流,或者说读取一行字符流到S中。
但如何区分是一行数据流,或者说数据流行单位是如何识别的,或者说行与行之间是如何区分的?是通过分隔符‘\n’,也就是终端输入的回车键来区分。
但数据流还有其他限制,比如存储空间大小,这里是数组大小,用户想提前结束输入,这里是通过EOF来区分,也就是用户键入“Ctrl+z”表示输入行输入提前结束。
所以 for(i=0; i<length-1 && (c=getchar())!=EOF && c!='\n';++i)循环的条件限制这里有三个。
之所以有这段代码
if(c == '\n'){
s[i] = c;
++i;
}
是因为,当用户键入回车‘\n’时,循环终止,行输入结束,但回车符‘\n’也是作为行数据的一部分理应存入数组存储空间,但循环终止没有存入,所以加这段代码来实现‘\n’字符的存储~
嗯。楼上的回答的都很好,**最好加上花括号**,不然程序结构太不清晰了;
虽然程序支持这个特性,但我们为了程序的可读性,**最好加上花括号**,这个并不会影响最终程序的大小和性能!
代码结构不好造成理解上的偏差倒有可能导致很多怪异问题的发生。
这个的确是c语言的一个弊端,很多情况下,不需要那个换行符'\n',我的方法是,直接抛掉那个'\n',换成'\0'
这里的if(c =='\n')有什么用?我觉得加上它反而错了。请知道的大牛告诉我一下,这是为什么?谢谢!
答:加与不加实现的内容不一样,如果有的话,意思是最后输入的回车要放到s数组里,如果没有的话,就少了一个回车,根据你自己的需要
//getline函数:将一行读入到S中并返回其长度
int getline(char s[], int length)
{
int c, i;
for(i = 0; i < length - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
{
s[i] = c;
}
if(c == '\n')
{
s[i] = c; //这里的语句去掉的话和本来的程序不等价,s数组里会少了一个回车
++i;
}
s[i] = '\0';
return i;
}
\n是换行,不是回车
s[i]=c多余,去掉就好了