c++ 修改字符串以包含整数的字符串 repr.

c++ Modify a String to contain the string repr. of an integer

本文关键字:字符串 repr 整数 修改 c++ 包含      更新时间:2023-10-16

我是科学家,不是程序员,请怜悯。

我想循环创建文件,在文件名中增加一个整数:

file01.txt
file02.txt
....
file10.txt

...

我有两个问题。这是我尝试过的内核:

char fn[] = "file00.txt";
int i = 1;
fn[5] = i;

这会导致错误"预期表达式"我虽然这应该工作,因为"字符是整数"

fn[5] = (char)i;

导致相同的错误。我还尝试了其他一些方法。 之后,我必须弄清楚当 i>9 和我有两个数字时会发生什么。 迫切需要的建议。

(我花了几个小时试图理解字符串、字符、数组等。 就在我认为我明白的时候,一个新的问题出现了。

简单的解决方案是

for(int file_index = 0; file_index < max_file_index; ++file_index) {
    // Render your file name:
    std::ostringstream file_name;
    file_name << "file" << std::setw(2) << std::setfill('0') << file_index << ".txt";
    // Create the file using file_name.str() 
    // (or file_name.str().c_str() for pre c++11 standards)
    std::ofstream outfile(file_name.str());
    // ...
} 

我完全不知道你为什么要费心改变

char fn[] = "file00.txt";

排在第1位。

如果您尝试这样做,转换应考虑字符值,例如

fn[5] = i + '0';
       // ^^^^^^

并且会给你带来更多复杂化,因为i值大于9.

另一种简单的方法,C 样式:

int i = 0; // ...
char fn[16];
sprintf(fn, "file%02d.txt", i);

你写的东西不会达到你的预期。您要将第 6 个字符(即第二个 0)更改为由数字表示的字符。看一下 ASCII 表,您会发现 0 整数不对应于"0"字符;实际上,它将对应于一个空字符,该字符用于指示 C 样式字符串中的字符串结尾。

即使将整数值转换为正确的 ASCII 值,仍然只会修改第二个零。所以 10 将导致"file0:.txt"而不是"file10.txt"。 :是在9之后。

我强烈建议不要以 C 方式执行此操作,您正在尝试这样做。使用std::string以确保安全性和简单性。

#include <iostream>
#include <string>
int main( )
{
    std::string name = "file";
    std::string extension = ".txt";
    for( int i = 0; i < 100; ++i )
    {
        std::string fullName;
        if( i < 10 )
           fullName = name + '0' + std::to_string( i ) + extension;
        else
           fullName = name + std::to_string( i ) + extension;
        std::cout << fullName << std::endl;
    }
}

产出(有遗漏):

file00.txt
file01.txt
...
file09.txt
file10.txt
file11.txt
...
file98.txt
file99.txt

注意:to_string需要 C++11。它在Windows上的一些g++版本上也被破坏了。这可以用itoa来完成,但不太优雅。