如何从其他函数保存打印的字符串?

时间:2019-01-09 20:52:00

标签: c

我想测试一个带有“ 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的调用似乎有问题,有什么建议吗? :)

3 个答案:

答案 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*参数,但是printExamplevoid。您的编译器应该已经警告过您。

如果您想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