我想测试一个带有“ void”类型的函数,该函数可以打印某些内容。
因此,我考虑过使用sprintf
并将printExample
的输出保存在testString
函数的数组中。
我的想法:
void printExample(){
printf("This is a string");
}
void testString(){
char stringArray[100];
sprintf(stringArray,"%s",printExample());
printf("%s",stringArray);
}
int main(){
testString();
}
需要在控制台上输出:这是一个字符串
我的printExample()
中的sprintf
的调用似乎有问题,有什么建议吗? :)
答案 0 :(得分:1)
已知printf
输出是“副作用” ,函数不会返回它。
在这种情况下,较为复杂的解决方案是将stdout
重定向到文件,然后检查文件的内容。
诸如:
char* testString()
{
// Redirect stdout to stdout.log
int out = open("stdout.log", O_RDWR|O_CREAT|O_APPEND, 0600);
int save_out = dup(fileno(stdout));
// Run function to be tested
printExample() ;
// restore stdout
fflush(stdout); close(out);
dup2(save_out, fileno(stdout));
close(save_out);
// Read back captured output
static char stdout_capture[100] ;
memset( stdout_capture, 0, 100 ) ;
FILE* fp = fopen( "stdout.log", "r" ) ;
fread( stdout_capture, 1, sizeof(stdout_capture) - 1, fp ) ;
fclose( fp ) ;
// return captured text to caller
return stdout_capture ;
}
int main()
{
printf( "%s\n", testString() ) ;
}
注意,为清楚起见,我在文件I / O中省略了任何错误检查代码。您可能要添加一些!
答案 1 :(得分:1)
函数printf
写入控制台,但与使用该函数的函数的返回值无关。
因此void printExample()
将打印This is a string
,但是-如正确的返回类型所示-不会返回printExample
的调用者可以使用的任何内容。
将printExample
用作sprintf(stringArray,"%s",printExample())
的参数是未定义的行为; sprintf(...,"%s"
期望有一个char*
参数,但是printExample
是void
。您的编译器应该已经警告过您。
如果您想printExample
返回一个字符串,则必须编写
const char* printExample() {
return "This is a string";
}
然后,您可以将调用printExample
的结果直接用作另一个printf
的参数。
但是,如果您只是想同时捕获一个字符串中打印到stdout
的所有内容(例如,以便进行自动测试),则可以暂时缓冲stdout
并访问该缓冲区然后。
void printExample(){
printf("This is a string");
}
void testString(){
char string[100] = {0};
setbuf(stdout, string);
printExample();
setbuf(stdout, NULL);
printf("\noutput of printExample: '%s'\n",string);
}
int main() {
testString();
return 0;
}
答案 2 :(得分:-1)
您应该使用return代替打印功能, 那么它将显示为“ This is a string”。 喜欢这张照片: enter image description here