将char转换为std :: string,然后进行串联

时间:2019-03-14 16:33:42

标签: c++ string interface fortran

尽管我看到了许多类似的问题,但我找不到解决这个特殊问题的方法。

我的问题很简单,但我完全陷入困境。我有一个简单的c ++函数,为此我尝试了类似的

void function1(char* filapp) {
   std::string filapp_2 = "";
   fprintf(stdout, "filapp_2: %s\n", filapp_2.c_str());
   filapp_2  += "A";
   fprintf(stdout, "filapp_2: %s\n", filapp_2.c_str());
   filapp_2  += "B";
   fprintf(stdout, "filapp_2: %s\n", filapp_2.c_str());
   filapp_2  += std::string(filapp);
   fprintf(stdout, "filapp_2: %s\n", filapp_2.c_str());
   filapp_2  += "D";
   fprintf(stdout, "filapp_2: %s\n", filapp_2.c_str());
}

如果输入值为“ C”,则将打印此代码

filapp_2:
filapp_2: A
filapp_2: AB
filapp_2: ABC
filapp_2: ABC

我尝试了许多其他方法,但这基本上始终是结果。我尝试过前置,并且会删除“ AB”。我不知道为什么。

当filapp连接时,字符串不再是动态的,而是变为常量。可能与以下事实有关:通过fortran接口调用此函数会限制内存?界面看起来像

module module_name
    implicit none
    interface
        subroutine function1 (filapp) bind(c)
            use iso_c_binding
            character(kind=c_char) :: filapp(*)
        end subroutine function1
    end interface
end module

编辑: 我被要求添加调用该函数的fortran部分。所以我正在做一个巨大的事情,所以一切都非常复杂。基本上,fortran函数看起来像

call function1(filapp)

其中filapp定义为

character(len=fnlen) :: filapp

与界面本身不同。我不确定这意味着什么。

1 个答案:

答案 0 :(得分:1)

std::string构造函数std::string(filapp)要求filapp为空终止。除非您努力做到这一点,否则Fortran中对该子例程的引用中的实际参数将不会为null终止。

考虑示例

use, intrinsic :: iso_c_binding, only : c_char, c_null_char
use module_name

call function1(c_char_'C'//c_null_char)
end

看看在没有附加c_null_char的情况下会发生什么。

更一般地,一个变量声明为

character(len=fnlen, kind=c_char) :: filapp

作为长度为fnlen的标量字符,可以作为参数传递给假定大小的伪参数,但是您再次需要使它以null终止:

call function1(TRIM(filapp)//c_null_char)

修剪是为了避免在终止之前留有空白。

或者,通过某种方式在filapp中使用空字符。