[英]Converting char to std::string, then concatenating
尽管我已经看到许多类似的问题,但是我找不到解决这个特殊问题的方法。
我的问题很简单,但我完全陷入困境。 我有一个简单的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
这与界面本身不同。 我不确定这意味着什么。
std::string
构造函数std::string(filapp)
要求filapp
以null终止。 除非您努力做到这一点,否则Fortran中对该子例程的引用中的实际参数不会为空终止。
考虑例子
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
使用空字符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.