免费注册 查看新帖 |

Chinaunix

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

关于NULL的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-06-20 09:07 |只看该作者 |倒序浏览
本帖最后由 hongshaohu 于 2012-06-20 09:08 编辑

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

void concatenate_str(char *str, ...);

int main(void) {
    char str[50];
    char *p = str;
    for(int i = 0; i < 50; ++i) {
        *p++ = 0;
    }
    concatenate_str(str, "The", " C ", "Programming", " Language");

    printf("%s\n", str);
    printf("%d\n", strlen(str));
    printf("%c\n", str[25]);
    printf("%d\n", str[26]);
    printf("%d\n", str[27]);

    return 0;
}

void concatenate_str(char *str, ...) {
    va_list e;
    va_start(e, str);
    char *p;
    while((p = va_arg(e, char*)) != NULL) {
        printf("p=%s\n", p);
        strcat(str, p);
    }
    va_end(e);
}
这个程序为什么在win7下执行printf("%d\n", strlen(str))时有错误?
如果在 concatenate_str(str, "The", " C ", "Programming", " Language")中的Language之后再加一个NULL参数就OK了。
不加NULL,打印出Language之后的字符 也是'\0',不清楚为什么程序执行strlen(str)就是不对?

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
2 [报告]
发表于 2012-06-20 09:13 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2012-06-20 09:16 |只看该作者
本帖最后由 hongshaohu 于 2012-06-20 09:26 编辑

回复 2# pmerofc


    嗯,理论上是的。不过我没加NULL,如果不执行strlen(str)则程序可以正常执行,而且str数组的元素已经被初始化为0了。为什么执行strlen(str)还有错误?

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
4 [报告]
发表于 2012-06-20 09:36 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2012-06-20 12:46 |只看该作者
NULL和'\0'是不一样的,你还不如用
while(*(p = va_arg(e, char*)) != '\0')
来判断

论坛徽章:
0
6 [报告]
发表于 2012-06-20 15:44 |只看该作者

  1.            #include <stdarg.h>
  2.            #define MAXARGS 100

  3.            /*  execl is called by
  4. [color=Red]               execl(file, arg1, arg2, ..., (char *)0);[/color]
  5.            */
  6.            execl(const char *file, const char *args, ...)
  7.            {
  8.                va_list ap;
  9.                char *array[MAXARGS];
  10.                int argno = 0;

  11.                va_start(ap, args);
  12.                if ((array[0] = args) != 0)
  13.                    while ((array[argno++] = va_arg(ap, char *)) != 0)
  14.                       ;
  15.                va_end(ap);
  16.                return execv(file, array);
  17.            }
复制代码
HP的调用举例
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP