【问题标题】:How to insert a number in the place I need in a string, in the C programming language如何在 C 编程语言中在字符串中我需要的位置插入数字
【发布时间】:2021-05-26 20:17:10
【问题描述】:

我刚开始用 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;
}

【问题讨论】:

  • 而不是char str[256];,您可能想要使用char str[PATH_MAX](PATH_MAX 在 中定义)

标签: c algorithm file


【解决方案1】:

最简单的方法是使用sprintf

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

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

编辑

William Pursell 在 cmets 中指出还有 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,那么您必须记住在完成后将strfree 一起释放。

【讨论】:

  • 或许适合演示一下snprintf
  • 非常感谢您的回答,您对我很有帮助。问题已结束!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-15
  • 2010-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
相关资源
最近更新 更多