免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1397 | 回复: 6
打印 上一主题 下一主题

两个小问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-07-05 22:47 |只看该作者 |倒序浏览
C语言中的字符串结尾如果不加\0,用printf %s打印是不是会一直打印到超出字符串的范围到某个未知字符?在Windows XP SP2下用cygwin练习, 同样一个程序,字符串结尾不加\0会多打印一些没规律的字符.
The C Programming Language SECOND EDITION中1.9 Character Arrays 中的程序:
#include <stdio.h>
#define MAXLINE 1000    /* maximum input line length */

int getline(char line[], int maxline);
void copy(char to[], char from[]);

/* print the longest input line */
main()
{
    int len;
    int max;
    char line[MAXLINE];
    char longest[MAXLINE];

    max = 0;
    while ((len = getline(line, MAXLINE)) > 0)
        if (len > max)
        {
            max = len;
            copy(longest, line);
        }
    if (max > 0)
        printf("%s", longest);
    return 0;
}

/* getline: read a line into s, return length */
int getline(char s[], int lim)
{
    int c, i;
&nbsp;&nbsp;&nbsp;&nbsp;for ( i = 0; i < lim-1 && (c=getchar()) != EOF && c != '\n'; ++i)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s[i] = c;
&nbsp;&nbsp;&nbsp;&nbsp;if (c == '\n')
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s[i] = c;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++i;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;s[i] = '\0';
&nbsp;&nbsp;&nbsp;&nbsp;return i;
}

/* copy: copy 'from' into 'to'; assume to is big enough */
void copy( char to[], char from[])
{
&nbsp;&nbsp;&nbsp;&nbsp;int i;

&nbsp;&nbsp;&nbsp;&nbsp;i = 0;
&nbsp;&nbsp;&nbsp;&nbsp;while ((to[i] = from[i]) != '\0')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++i;
}



其中getline函数中,如果s[lim-1]为\n的话,那么最后的\0就写到字符串外了.我分析的对不对?

另外帖子编辑中的插入代码似乎有些问题,代码中注释前的UBB代码为[color=#FF9900>,还要手动编辑一下.

[ 本帖最后由 ibmwebzh 于 2007-7-6 12:24 编辑 ]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2007-07-05 23:46 |只看该作者
〉〉for ( i = 0; i <  lim-1 && (c=getchar()) != EOF && c != '\n'; ++i)
你看到 i <  lim-1这个条件没有?

printf会打印直到遇到'\0'结束。

论坛徽章:
0
3 [报告]
发表于 2007-07-06 12:31 |只看该作者
原帖由 lenovo 于 2007-7-5 23:46 发表
〉〉for ( i = 0; i <  lim-1 && (c=getchar()) != EOF && c != '\n'; ++i)
你看到 i <  lim-1这个条件没有?

printf会打印直到遇到'\0'结束。


注意到了,但s[lim]的范围是s[0]到s[lim-1],如果某一行恰好s[lim-1]为\n的话,getline会执行s[lim] = '\0'.如果i < lim-2或main中char line[MAXLINE+1]或while (( len = getline(line,MAXLINE-1)) > 0)会避免这个问题.

[ 本帖最后由 ibmwebzh 于 2007-7-6 12:34 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2007-07-06 12:37 |只看该作者
结果未定义。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
5 [报告]
发表于 2007-07-06 13:00 |只看该作者
原帖由 ibmwebzh 于 2007-7-6 12:31 发表


注意到了,但s[lim]的范围是s[0]到s[lim-1],如果某一行恰好s[lim-1]为\n的话,getline会执行s[lim] = '\0'.如果i < lim-2或main中char line[MAXLINE+1]或while (( len = getline(line,MAXLINE-1)) > 0)会避免 ...

〉〉如果某一行恰好s[lim-1]为\n的话
你仔细看,上述条件不可能。

论坛徽章:
0
6 [报告]
发表于 2007-07-06 13:05 |只看该作者
原帖由 lenovo 于 2007-7-5 23:46 发表
〉〉for ( i = 0; i <  lim-1 && (c=getchar()) != EOF && c != '\n'; ++i)
你看到 i <  lim-1这个条件没有?

printf会打印直到遇到'\0'结束。

或者core掉?我觉得还是有可能core掉的,如果一直没碰到'\0'。

论坛徽章:
0
7 [报告]
发表于 2007-07-06 18:42 |只看该作者
原帖由 lenovo 于 2007-7-6 13:00 发表

〉〉如果某一行恰好s[lim-1]为\n的话
你仔细看,上述条件不可能。


明白了,谢谢,我似乎有点粗心.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP