如何在字符串中我需要的地方插入数字,在C编程语言



我刚开始用C语言写东西,我遇到了一个小问题,更多的是与算法有关,而不是与语言的特性有关。

在我的程序中,任务是如果文件名中有_符号,则在_符号后插入文件大小。

我不太明白这是如何实现的,也许有人会告诉你,有一个现成的算法来处理这个,插入一个数字到字符串(字符数组)

下面是我的代码示例,并解释了在哪里和做了什么:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <string.h>
int main(){
DIR * p;
p = opendir("."); // Open catalog
if(p!=NULL){ // check on error
struct dirent * dir;
while((errno=0, dir=readdir(p))){  // Reading catalog
struct stat infoAboutFile;
int res = stat(dir->d_name, &infoAboutFile);
if(res==0){ // check on error
if(S_ISREG(infoAboutFile.st_mode)){ // Check on regular files
char str[256];
strcpy(str,dir->d_name);
int size = infoAboutFile.st_size; //Size file                   

printf("n");
}
}else{
perror("Errors in Stat");
}
}
if(errno!=0){ // check on error
perror("Errors in Readdir");
}

int res = closedir(p);
if(res==-1){ // check on errorr
perror("Errors in Closedir");
}
}else{
perror("Errors in Opendir");
}
return 0;
}

最简单的方法是使用sprintf:

sprintf( str, "%s_%d", dir->d_name, size );

您需要确保str的宽度足以容纳最终字符串。

编辑

William Pursell在评论中指出,还有snprintf,在这里您指定要写入目标缓冲区的最大字符数,以避免意外缓冲区溢出:

snprintf( str, sizeof str, "%s_%d", dir->d_name, size );

就我个人而言,我更喜欢确保目标缓冲区对最终字符串足够大,而不是冒险截断字符串。我们需要做的第一件事是计算需要多大的缓冲区:

size_t str_len = strlen( dir->d_name ) // length of d_name
+ 10                  // number of decimal digits in a 32-bit int
+ 1;                  // for the '_' character

如果你的编译器支持可变长度数组,那么我们只需声明一个大小为str_len的数组:

char str[ str_len + 1 ];  // +1 for the string terminator           

否则,我们需要动态分配缓冲区:

char *str = malloc( str_len + 1 ); // +1 for the string terminator

那么你可以使用常规的sprintf:

sprintf( str, "%s_%d", dir->d_name, size );

如果你使用malloc,那么当你用完free的时候,你必须记住释放str

最新更新