Chinaunix

标题: 关于NULL的问题 [打印本页]

作者: hongshaohu    时间: 2012-06-20 09:07
标题: 关于NULL的问题
本帖最后由 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)就是不对?

作者: pmerofc    时间: 2012-06-20 09:13
提示: 作者被禁止或删除 内容自动屏蔽
作者: hongshaohu    时间: 2012-06-20 09:16
本帖最后由 hongshaohu 于 2012-06-20 09:26 编辑

回复 2# pmerofc


    嗯,理论上是的。不过我没加NULL,如果不执行strlen(str)则程序可以正常执行,而且str数组的元素已经被初始化为0了。为什么执行strlen(str)还有错误?
作者: pmerofc    时间: 2012-06-20 09:36
提示: 作者被禁止或删除 内容自动屏蔽
作者: dataxdata    时间: 2012-06-20 12:46
NULL和'\0'是不一样的,你还不如用
while(*(p = va_arg(e, char*)) != '\0')
来判断
作者: blackuhlan    时间: 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的调用举例




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2