是否有另一种截断字符串的方法?

时间:2010-08-31 23:19:23

标签: c string char

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个字符,因为它来自用户输入?

谢谢。

6 个答案:

答案 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 );
}