如何定义具有正确宽度或可变宽度的字符指针?
我的情景如下......
void processRa(int _raCount, char *raFile)
{
char *command; // How to correctly define this variable ?
sprintf(command, "somecomm -r %s -N%d-%d ", raFile, (_raCount - 1), (_raCount - 1));
system(command);
}
在场景中,我定义了一个char指针command
。 command
的大小取决于函数传递变量raFile
和以下行的命令。
答案 0 :(得分:3)
char*
没有相关存储空间。这与fortran之类的语言不同,其中字符类型代表固定大小的字符串。您必须使用char command[size+1]
之类的内容定义字符数组,或者使用malloc()
进行分配(当您使用时不要忘记调用free()
完成字符串)。
棘手的部分是正确计算所需的长度。但是,在POSIX-2008标准中,已经存在一个名为asprintf()
的函数,它正是您所需要的:它结合了sprintf()
的功能和使用malloc()
分配足够的内存(再次,不要忘记在完成字符串时调用free()
)。用法如下:
void processRa(int _raCount, char *raFile) {
char *command; // How to correctly define this variable ?
asprintf(&command, "somecomm -r %s -N%d-%d ", raFile, (_raCount - 1), (_raCount - 1));
system(command);
free(command);
}
答案 1 :(得分:1)
动态分配:
char *command = malloc(strlen(raFile) + N));
其中N是目标字符串其余部分的最大可能长度(在您的情况下包括空终止符,静态文本和两个动态整数)。
答案 2 :(得分:1)
int raFileLen = strlen( raFileLen ) ;
int extraInfo = strlen( "somecomm -r -N" ) + (sizeof(int)*2) + raFileLen + 10 ;
// 10 bytes:: just to be safe
char* command = malloc( extraInfo ) ;
if( command == NULL ) return -1 ;
// Codes .... Codes
free( command ) ;
答案 3 :(得分:1)
somecomm = 8
-r = 2
%s = strlen(raFile)
-N = 2
%d = max 10 digits = 10 * 2 = 20
spaces = 4 (the trailing space also included)
-----------------------------------
total = 37 (one for '\0') + strlen(raFile);
-----------------------------------
我会说malloc(37 + strlen(raFile));
就足够了
答案 4 :(得分:0)
这应该适合你,我相信:
command = malloc(strlen(raFile)+someBytes);
当然我假设raFile
为空终止。