1

我有一个调用 C 函数的 Fortran 子例程。C 函数的参数之一是 fortran 字符串。这被初始化为一个长度为 512 字节的空字符串,并作为 传递给 C 函数trim(str)//char(0),即它被修剪并\0附加 a,以便 C 将其strlen视为 0。

character(len=512)  :: str = ""
call C_foo (  trim(str)//char(0)  )

现在在 C 函数内部,我可以这样做吗

strncpy (str, "something", strlen("something") )

我想知道的是,既然trim是其文档中提到的转换函数,那么将它传递给 C 是否真的会改变分配给它的空间?在 C 函数内部,strncpy 是否会失败(就源字符串的长度而言 < 512)?我试过了,它工作正常,但我想确保它是安全的。

4

2 回答 2

4

为什么不use使用 ISO_C_BINDING 并通过以下方式初始化字符串:

character(len=512)  :: str = C_NULL_CHAR

那么字符串将是 512 长,第一个字符是 C 字符串空字符,其余为空白。

于 2013-09-26T16:00:50.247 回答
2

详细说明我的评论,而不涉及“C”的作用,请考虑这个纯 fortran 示例:

character(len=512) :: g=""
call f(trim(g))
end

subroutine f(s)
character(len=*) :: s
integer :: i
do i=1,100
 s(i:i)="0"
enddo
end

这编译得很好但有段错误,而只是

call f(g)

很好。或者,如果我们将 g 指定为足够长的非空白字符串,例如添加

g(100:100)="0"

它运作良好。

您看到的是 trim() 传递的字符串只有所需的长度(在第一种情况下为零),如果添加 //char(0) 则为 1)

顺便说一下子程序中的一个简单赋值

s=" ... 512 characters .. "

作品.. 仅在提供的空间中适合许多角色。有趣的是(gfortran)不知何故知道要填充多少空间......但我不会指望它。

于 2013-09-26T18:52:47.643 回答