user-0 提问: 自己写了一个程序  要求是输出字符串 不知道哪里出现问题了 帮忙看下！

回复:
user: user-1
content: 引用int main() {   shuchu("string");   getch();   return 0; }  吓尿了！  引用代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  慎重！

user: user-2
content: 下面是 <stdarg.h> 里面重要的几个宏定义如下： typedef char* va_list; void va_start ( va_list ap, prev_param ); /* ANSI version */ type va_arg ( va_list ap, type );  void va_end ( va_list ap );  va_list 是一个字符指针，可以理解为指向当前参数的一个指针，取参必须通过这个指针进行。 <Step 1> 在调用参数表之前，定义一个 va_list 类型的变量，(假设va_list 类型变量被定义为ap)； <Step 2> 然后应该对ap 进行初始化，让它指向可变参数表里面的第一个参数，这是通过 va_start 来实现的，第一个参数是 ap 本身，第二个参数是在变参表前面紧挨着的一个变量,即“...”之前的那个参数； <Step 3> 然后是获取参数，调用va_arg，它的第一个参数是ap，第二个参数是要获取的参数的指定类型，然后返回这个指定类型的值，并且把 ap 的位置指向变参表的下一个变量位置； <Step 4> 获取所有的参数之后，我们有必要将这个 ap 指针关掉，以免发生危险，方法是调用 va_end，他是输入的参数 ap 置为 NULL，应该养成获取完参数表之后关闭指针的习惯。说白了，就是让我们的程序具有健壮性。通常va_start和va_end是成对出现。

user: user-3
content: 字符串这样搞来搞去效果不明显，如果是练习可变参数函数的使用，可以用整型来测试

user: user-0
content: 引用 6 楼 Intel0011 的回复:仅供参考 #include <stdio.h> #include <stdlib.h> #include <stdarg.h>  void shuchu(char *format, ...) {        va_list cp;      va_start(cp, format);      vprintf(format, cp);      va_end(cp); }   int main(void) {   shuchu("string %s %s %d\n", "adads", "adsada", 123);  shuchu("string");   getchar();    return 0; }谢谢！！！！！

user: user-4
content: 仅供参考 #include <stdio.h> #include <stdlib.h> #include <stdarg.h>  void shuchu(char *format, ...) {        va_list cp;      va_start(cp, format);      vprintf(format, cp);      va_end(cp); }   int main(void) {   shuchu("string %s %s %d\n", "adads", "adsada", 123);  shuchu("string");   getchar();    return 0; }

user: user-5
content: 引用 4 楼 sinat_17012035 的回复:[quote=引用 1 楼 modyaj 的回复:]  卡死 首先看循环   先看看你这个循环怎么跳出来吧    for(;*data!='\0';i++)     {         temp=va_arg(cp,char *);         printf("%s",temp);          }恩我在后面加了一句 data++ for(;*data!='\0';i++)     {         temp=va_arg(cp,char *);                data++;         printf("%s",temp);     }  不卡死了 当结果还是没有出来[/quote] 我对va_XXX也没实用过，但是你去查一下，va_start说的是返回第一个可变参数！那很明显，你的第一个可变参数没有，所以循环内根本就取不到东西，再加上用data!=0来判断就更错了！问题很多，像赵老师说的，打几个断点，一步一步的调试，你会明白很多！

user: user-6
content: 给你参考一下 #include <stdio.h> #include <stdarg.h>  void shuchu(char *data,...) { 	va_list ap; 	char *tmp;  	va_start(ap,data); 	printf("%s\n",data);//此处输出"string" 	while(1) 	{ 		tmp = va_arg(ap,char *); 		if(tmp == (char *)0) 		{ 			break; 		} 		printf("%s\n",tmp); //此处输出可变参数 	} 	va_end(ap); } int main() { 	shuchu("string","string2","string3",(char *)0); 	return 0; }

user: user-0
content: 引用 1 楼 modyaj 的回复:卡死 首先看循环   先看看你这个循环怎么跳出来吧    for(;*data!='\0';i++)     {         temp=va_arg(cp,char *);         printf("%s",temp);          }恩我在后面加了一句 data++ for(;*data!='\0';i++)     {         temp=va_arg(cp,char *);                data++;         printf("%s",temp);     }  不卡死了 当结果还是没有出来

user: user-0
content: 还是学生，才接触一些c语言，所以希望有空  帮忙看下

user: user-7
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-5
content: 卡死 首先看循环   先看看你这个循环怎么跳出来吧    for(;*data!='\0';i++)     {         temp=va_arg(cp,char *);         printf("%s",temp);          }

user: user-8
content: 引用 8 楼 WXJ0415 的回复:这是C语言吗？输出怎么用shuchu   应该是printf  呀 void 是函数的写法 你说的printf 只是在mian函数中的输出输出的语句多了，想puts 什么的

user: user-9
content: shuchu~~~    建议楼主多用英文名，printf什么的命名  顾名思义，这个练好。以后有好处

user: user-10
content: 这是C语言吗？输出怎么用shuchu   应该是printf  呀