c++ - 将 char 转换为 std::string,然后连接

标签 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 接口(interface)调用此函数有关?界面看起来像

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 中对子例程的引用中的实际参数不会以 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 中包含空字符。

关于c++ - 将 char 转换为 std::string,然后连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55167723/

相关文章:

ruby-on-rails - 如何在ruby中组合字符串

java - 生成正则表达式以匹配列表 A 中的字符串,但不匹配列表 B 中的字符串

c++ - 为什么我不能调用 QMetaObject::invokeMethod(&threadObj, &QThread::start, Qt::QueuedConnection)?

C++ Hello World 不编译

c++ - 我仍然不相信在对象不是 `destructor` 的情况下调用 `constructed`

string - Perl:向 $_ 添加字符串会产生奇怪的结果

c++ - 使用 CMake 创建 C++ 库

java - 如何在接口(interface)类型的引用上调用 Object 类的方法?

java - Integer 扩展 Number 但无法对 <?用 Integer 扩展 Number>

c# - 无法使用接口(interface)默认方法