int 转 string 输出 (不用库函数)

本文介绍了一个C++程序,该程序实现了将整数转换为字符串,并对字符串进行反转的功能。通过几个测试用例展示了如何使用这些函数。文章包含完整的源代码实现。

#include "stdafx.h"
#include <iostream>
#include <stdio.h>


using namespace std;


void testFormat(int number);
int intToStr(int number, char** szBuffer);
int reverseStr(char** szBuffer);


int _tmain(int argc, _TCHAR* argv[])
{
testFormat(123);
testFormat(123456789);
testFormat(-369542);


system("pause");
return 0;
}


void testFormat(int number)
{
 char buf[50];
 char * b = buf;
 if(intToStr(number,&b) == 0){
  printf("\nint to string success! %d --> \"%s\"\n",number,b);
 }
 else
 {
  printf("\nint to string fail! %d --> \"%s\"\n",number,b);
 }
}


/*
funcation: format int to string
input : number
output: ** szBuffer
return 0 success, -1 fail
*/
int intToStr(int number, char ** szBuffer)
{
int iRet = -1;
if (NULL == *szBuffer)
goto RETURN;


char * buf = *szBuffer;


int num1 = 0, num2 = number;


//如果是负数,先转换为正数
num2 = number > 0 ? number : (number * -1);


//将数字转换为 char
do 
{
num1 = num2 % 10;
*buf = num1 + '0';


buf++;
num2 = num2 / 10;
} while (num2 != 0);


if(0 > number)//负数
{
*buf = '-';
buf++;
}
*buf = '\0';


iRet = reverseStr(szBuffer);


RETURN:
return iRet;
}


/*
funcation : reverse string
intput : ** szBuffer
return 0 succes, -1 fail
*/
int reverseStr(char** szBuffer)
{
int iRet = -1;


if(NULL == *szBuffer)
goto RETURN;


//将转换的字符串逆序
char * p1 = *szBuffer;
char * p2 = p1;


while (*p2++ != '\0');//将p2 指向字符串尾部


p2--;
p2--;


while (p2 > p1)
{
*p1 = *p1 + *p2;
*p2 = *p1 - *p2;
*p1 = *p1 - *p2;


p1++;
p2--;
}


iRet = 0;


RETURN:
return iRet;
}
<think> 我们正在讨论C++中的整数字符串的库函数。在C++中,有几种方法可以将整数换为字符串,包括使用标准库函数和C++11引入的新方法。以下是几种常用的方法: 1. 使用C++11的std::to_string 2. 使用std::ostringstream 3. 使用C标准库的sprintf(不推荐,但有时用于兼容C) 4. 使用C++17的std::to_chars(无分配,高效但需要预先分配缓冲区) 下面我将分别展示这些方法,并给出代码示例。 </think> # C++ 中将整数换为字符串的库函数详解 在 C++ 中,有多种标准的库函数可以将整数换为字符串,每种方法都有其适用场景和特点。下面是五种主要方法的详细说明和代码示例: ## 1. `std::to_string` (C++11 及以上) 这是最简单直接的方法,适用于基本整数类型: ```cpp #include <iostream> #include <string> // 需要包含 string 头文件 int main() { int num = 42; double pi = 3.14159; // 换整数类型 std::string intStr = std::to_string(num); std::cout << "整数换: " << intStr << "\n"; // 输出: 整数换: 42 // 换浮点数类型 std::string doubleStr = std::to_string(pi); std::cout << "浮点数换: " << doubleStr << "\n"; // 输出: 浮点数换: 3.141590 // 支持的类型 long l = 1234567890L; unsigned long ul = 9876543210UL; std::cout << std::to_string(l) << "\n"; // 长整数 std::cout << std::to_string(ul) << "\n"; // 无符号长整数 return 0; } ``` **特点**: - 最简单的换方法 - 支持所有基本数值类型 - 默认十进制换 - 浮点数会有固定的小数位数 ## 2. `std::stringstream` (更灵活的控制) 当需要控制格式(如进制、填充)时,使用字符串流更合适: ```cpp #include <iostream> #include <sstream> // 需要包含 sstream 头文件 #include <iomanip> // 用于格式控制 int main() { int value = 255; // 创建字符串流 std::ostringstream oss; // 十进制换 oss << value; std::cout << "十进制: " << oss.str() << "\n"; // 输出: 十进制: 255 // 重置流 oss.str(""); // 清空内容 oss.clear(); // 清除错误标志 // 十六进制换 oss << std::hex << value; std::cout << "十六进制: " << oss.str() << "\n"; // 输出: 十六进制: ff // 带格式的浮点数 double d = 3.1415926535; oss.str(""); oss << std::fixed << std::setprecision(4) << d; std::cout << "浮点数: " << oss.str() << "\n"; // 输出: 浮点数: 3.1416 // 带前导零 int id = 42; oss.str(""); oss << std::setw(5) << std::setfill('0') << id; std::cout << "带前导零: " << oss.str() << "\n"; // 输出: 带前导零: 00042 return 0; } ``` **特点**: - 提供完整的格式控制 - 支持各种数据类型和格式选项 - 可以组合多个值到一个字符串中 - 比 `std::to_string` 更灵活 ## 3. `sprintf` (C 风格函数) 兼容 C 语言的换方法,常用于嵌入式系统或性能敏感场景: ```cpp #include <iostream> #include <cstdio> // 需要包含 cstdio 头文件 #include <string> int main() { char buffer[50]; // 需要预分配缓冲区 int num = 42; double pi = 3.14159; // 整数换 sprintf(buffer, "%d", num); std::string intStr(buffer); std::cout << "int: " << intStr << "\n"; // 输出: int: 42 // 十六进制换 sprintf(buffer, "%x", num); std::cout << "十六进制: " << buffer << "\n"; // 输出: 十六进制: 2a // 浮点数换 sprintf(buffer, "%.2f", pi); std::cout << "浮点数: " << buffer << "\n"; // 输出: 浮点数: 3.14 // 组合多个值 int x = 10, y = 20; sprintf(buffer, "坐标为: (%d,%d)", x, y); std::cout << buffer << "\n"; // 输出: 坐标为: (10,20) return 0; } ``` **特点**: - C 标准库函数,兼容性好 - 格式控制丰富 - 需要手动管理缓冲区大小 - 存在缓冲区溢出风险 ## 4. `std::format` (C++20 新特性) C++20 引入的更现代、更安全的格式化方法: ```cpp #include <iostream> #include <format> // C++20 需要支持 int main() { int count = 42; double price = 9.99; // 基本换 std::string s = std::format("数量: {}", count); std::cout << s << "\n"; // 输出: 数量: 42 // 组合多个值 s = std::format("价格: ${:.2f} x {} = ${:.2f}", price, count, price * count); std::cout << s << "\n"; // 输出: 价格: $9.99 x 42 = $419.58 // 格式控制 int hexValue = 255; s = std::format("十六进制: {:x}", hexValue); // 输出: 十六进制: ff s = std::format("科学计数法: {:.2e}", 1234567.89); // 输出: 科学计数法: 1.23e+06 // 本地化支持 s = std::format("{:L}", 123456789); // 根据本地化添加千位分隔符 // 在美国英语环境下输出: 123,456,789 return 0; } ``` **特点**: - 类型安全,避免缓冲区溢出 - 类似 Python 的格式化语法 - 支持本地化 - 需要支持 C++20 的编译器 ## 5. `std::to_chars` (高性能无分配) 用于高性能场景的无分配换,避免内存分配开销: ```cpp #include <iostream> #include <charconv> // 需要包含 charconv 头文件 (C++17) #include <array> int main() { int value = 12345; std::array<char, 20> buffer{}; // 固定大小缓冲区 // 换整数 auto [ptr, ec] = std::to_chars(buffer.data(), buffer.data() + buffer.size(), value); if (ec == std::errc{}) { std::string result(buffer.data(), ptr); std::cout << "换成功: " << result << "\n"; // 输出: 换成功: 12345 } else { std::cerr << "换失败\n"; } // 换浮点数 double pi = 3.1415926535; auto [fptr, fec] = std::to_chars(buffer.data(), buffer.data() + buffer.size(), pi, std::chars_format::fixed, 4); if (fec == std::errc{}) { std::string result(buffer.data(), fptr); std::cout << "浮点数: " << result << "\n"; // 输出: 浮点数: 3.1416 } return 0; } ``` **特点**: - 不进行内存分配,高性能 - 需要预先分配缓冲区 - 提供错误码而非抛出异常 - C++17 及以上支持 ## 方法对比指南 | 方法 | C++版本 | 安全性 | 性能 | 灵活性 | 内存分配 | |------|---------|--------|------|--------|----------| | `std::to_string` | C++11 | 高 | 中等 | 低 | 是 | | `std::stringstream` | C++98 | 高 | 低 | 高 | 是 | | `sprintf` | C++98 | 低 | 高 | 高 | 否 | | `std::format` | C++20 | 高 | 中等 | 高 | 是 | | `std::to_chars` | C++17 | 高 | 非常高 | 中等 | 否 | ## 最佳实践建议 1. **现代 C++ 推荐**: - 一般情况优先使用 `std::to_string` - 需要格式控制使用 `std::format` (C++20) - 高性能需求使用 `std::to_chars` 2. **性能优化技巧**: ```cpp // 重用字符串流避免重复分配 thread_local std::ostringstream oss; oss.str(""); oss << value; std::string result = oss.str(); ``` 3. **类型安全注意事项**: - 避免混合使用数值类型 - 使用 `auto` 避免隐式类型换问题 ```cpp auto num = 42; // int auto str = std::to_string(num); // 明确指定类型 ``` 4. **错误处理**: ```cpp try { int largeNum = 1234567890; std::string s = std::to_string(largeNum); } catch (const std::bad_alloc& e) { // 处理内存分配失败 } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值