char out_file_name[30];
ogSize = strlen(FileName); //i.e. - FileName_anylength.log (always.log)
ogSize -= strlen(IN_FILE_SUFFIX); //amount of chars before .log
strncpy( out_file_name, FileName, ogSize ); //out_file_name now is FileName_anylength (without the .log)
这是最好的方法吗?
另外,我如何防范ogSize不会超过30个字符,因为它来自用户输入?
谢谢。
答案 0 :(得分:17)
使用C风格的字符串,您只需将要截断的字符设置为\0
。
关于你的第二个问题,基本上你检查一下。或者根据字符串大小分配尽可能多的内存(请记住包含\0
的空间)。
答案 1 :(得分:2)
看看:
char *trunc;
char *outfile;
strdup( outfile, FileName );
if ( ((trunc = strstr( out_file_name, ".log" )) != NULL )
*trunc = '\0';
return ( outfile ); // assumes returning result from function
答案 2 :(得分:2)
首先考虑你的最后一个问题,确保最大尺寸非常容易。通常,您希望使用fgets
来读取字符串。这允许您指定最大长度。或者,您可以指定scanf格式的最大大小(例如"%29s"
或"%29[^\n]"
)。请注意两者之间的区别:使用fgets
指定缓冲区大小,但使用scanf
指定一个小于缓冲区大小(即,要读取的最大字符数)。
至于第一个问题:是的,通常有更好的方法。 strncpy
是一个奇怪的函数,最初是为了一个相当特定的目的而编写的,并且(说实话)应该从标准库中删除,因为虽然它似乎它应该是有用的,它几乎从来都不是。
我可能会做一些不同的事情。一种可能性是使用snprintf
,例如:
snprintf(
out_file_name,
sizeof(out_file_name),
"%*s",
strlen(FileName) - strlen(IN_FILE_SUFFIX), FileName);
答案 3 :(得分:2)
使用fgets()从用户读取字符串,这样就可以指定字符串的最大长度
char* from = FileName;
char* to = out_file_name;
int curLen = 0;
do
{
*to++=*from++
}
while(*from && *from!='.' && ++curLen < ogSize);
*to='\0';
答案 4 :(得分:1)
您可以在字符串中插入null以缩短它。函数strstr()下面用于查找第一次出现的“.log”的地址。之后,您可以相互减去两个地址,以找出名称的长度以及插入空值的位置。
int main() {
char suffix[] = ".log";
char filename[] = "FileName_anylength.log";
char* end_address = strstr(filename, suffix);
filename[end_address-filename] = 0;
printf("%s", filename);
}
答案 5 :(得分:1)
char out_file_name[30];
char *suffix=".log";
size_t IN_FILE_SUFFIX = strlen(suffix);
/* also works, if suffix occurs more than 1 time or never ! */
if( strstr( out_file_name, suffix ) )
out_file_name[ strlen(out_file_name) - IN_FILE_SUFFIX ] = 0;
或
char out_file_name[30];
char *suffix=".log";
size_t IN_FILE_SUFFIX = strlen(suffix);
/* also works, if suffix occurs more than 1 time or never ! */
if( strstr( out_file_name, suffix ) )
{
char format[20];
sprintf( format, "%%.%ds", strlen(out_file_name) - IN_FILE_SUFFIX );
sprintf( out_file_name, format, out_file_name );
}