利用do-while语句实现itoa(数字-->字符串)函数,并且分析将数组作为函数返回值的方式

C/C++ 字符与数字互转的底层逻辑:从ASCII码到实战应用(新手必看!!!) 本文深入解析C/C++中字符与数字互转的底层逻辑,重点介绍ASCII码的原理及实战应用。通过经典减法运算、标准库函数和现代C++方法等多种转换技巧,帮助开发者高效处理字符数字转换问题,并避免常见陷阱。特别适合新手掌握ASCII码在编程中的核心应用。 阅读详情
1, 利用do-while语句实现itoa(数字-->字符串)函数:
/*将整数转换为字符串*/
/*将数组作为函数返回值得第一种方法:返回一个指针*/
char* itoa(int n)
{
  char s[5];
   int sign, i;
   if((sign = n)<0)
   n = -n;
   i = 0;
   do
   {
     s[i++] = n % 10 + '0';
   }while((n/=10)>0);/*注意,do-while语句中的while后要有分号;*/
   if(sign<0)
   s[i++] = '-';
   s[i] = '\0';
   reverse(s);
   return s;
}
/*将数组作为函数返回值得第二种方法:将数组作为函数参数传递*/
/*实质上,就是按指针地址引用传递的一种思想*/
/*数组名作为函数参数传递其实上就是传递数组首地址(指针)*/
void itoa(int n, char s[])
{
   int i, sign;
   if((sign = n)<0)
   n = -n;
   i = 0;
   do
   {
     s[i++] = n % 10 + '0';
   }while((n/=10)>0);
   if(sign<0)
   s[i++] = '-';
   reverse(s);
}

 

2,C语言之将数组作为返回值传递出函数:

写一个函数int *MakeArray(int c),生成大小为c的一个数组,返回指向这个数组的指针。

    在函数内定义一个整形指针p,将数组名赋给p。直接的return array;是不行的,编译器给出警告信息。另外,array++的写法也不通。

    开始,在函数中定义数组并初始化为1,2,3,……等等。函数中输出数组的值,无论是用array[i]的方式还是*p++的方式,都正确。

    但是,将数组名通过指针传出函数之外,并在main()中用一个整形指针p存储,在用*p++访问,却总是不正确,都是垃圾值。

    数组大概也有其生存周期。在函数int *MakeArray(int c)中定义数组,那么此数组的生存周期只在函数体内。离开函数后,此数组内容已被系统销毁。虽然通过指针传出并访问数组地址,但是其中的值已经不存在了。

    所以,在main()函数用*p++访问,打印出来的总是别的值。

    代码在此:

/*
how to return an array? try it.
*/

#define DEBUG

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int *MakeArray(int c)
 {
  if(c<1)
   {return 0;}
  else
   {
    int array[c];
    
    puts("\ninput the array data:\n");
    int i;
    for(i=0;i<c;i++)
     {scanf("%d",&array[i]);}
    
    #ifdef DEBUG
    puts("\noutput in function(array[i]):\n");
    for(i=0;i<c;i++)
     {printf("%d\n",array[i]);}
    #endif
    
    int *p=array;
    #ifdef DEBUG
    printf("\np is %d,array is %d.\n",p,array);
    
    //for(i=0;i<c;i++)
     //{
      //printf("array pointer %10d stored %10d.\n",array,*array);
      //array++;//invalid code here...
     //}//end for
    puts("\noutput in function(*p++):\n");
    for(i=0;i<c;i++)
     {
      printf("pointer %10d stored %10d.\n",p,*p);
      p++;
     }
    p=array;
    #endif
    return p;
   }
  
 }//end 

main()
 {
  puts("\ninput the length of your array:\n");
  int c;
  scanf("%d",&c);
  
  int *p=MakeArray(c);
  #ifdef DEBUG
  printf("\nthe pointer got from function is %d.\n",p);
  #endif
  
  
  puts("\nmain output:\n");
  int i;
  for(i=0;i<c;i++)
   //{printf("%d\n",p[i]);}
   //{printf("%d\n",*(p--));}
   {
    printf("pointer %10d stored %10d.\n",p,*p);
    p++;
   }//end for
 }//end main

/*
[Linker   error]   undefined   reference   to   `WinMain@16 '

main function error
*/

/*
Output here:

D:\>return1array.exe

input the length of your array:

3

input the array data:

1
2
3

output in function(array[i]):

1
2
3

p is 2293504,array is 2293504.

output in function(*p++):

pointer    2293504 stored          1.
pointer    2293508 stored          2.
pointer    2293512 stored          3.

the pointer got from function is 2293504.

main output:

pointer    2293504 stored 2009143661.
pointer    2293508 stored 2009267360.
pointer    2293512 stored 2009143487.

D:\>

So now,you can see it clearly.
*/



数组可以以指针的方式返回,或者可以通过按指针(或数组名)作为函数参数传递,间接地改变数组的值,并输出。

实质上,数组名作为函数参数传递其实上就是传递数组首地址(指针)

#include <stdio.h>
int* fun(int*a,int b);
int main() 
{ 
	int a[5]= { 1,2,3,4 } ,*ptr,i; 
	ptr=fun(a,4); 
	for(i=0;i<4;i++) 
		printf("ptr[%d]=%d\n",i,ptr[i]); 
	return 0 ; 
}

int* fun(int*a,int b)

{ int i ; 
  for(i=0;i<b;i++) 
	  a[i]+=1 ; 
  return a ; 
}


3,此外,在C#中,可以直接返回一个数组类型的值,这与C是不同的!

public int[] randques(){ 
int[] arr=new int[10]{0,1,2,3,4,5,6,7,8,9}; 
return arr; 
} 
//这样就返回的就是10个元素的数组
/*申明任意一长度为10的整形数组来接收这个方法的返回值即可*/ 



 

嵌入式开发中ASCII码的核心原理、实战应用与避坑指南 字符编码是计算机数据表示与交换的基石,其中ASCII码作为最基础、应用最广泛的字符集标准,定义了128个字符的二进制映射关系,包括可打印字符和控制字符。其技术价值在于为设备间提供了一套通用、可靠的文本交互协议,尤其在资源受限、直接硬件交互的嵌入式系统中至关重要。在工程实践中,ASCII码不仅是人机交互(如调试信息输出、命令行接口)的桥梁,其控制字符部分(如\r\n、\0)更构成了底层通信协议的核心逻辑,直接影响串口通信、数据解析与存储的稳定性。本文聚焦嵌入式开发场景,深入探讨ASCII码在数值转换、通信协议 阅读详情

相关推荐

C++高效字符串拼接:告别cout,实现高性能StringAppender

在C++开发中,字符串拼接与格式化是高频操作,传统方法如std::cout和std::stringstream在复杂场景下存在性能瓶颈和代码可读性差的问题。其原理在于频繁的运算符重载和潜在的缓冲区刷新,导致运行时开销较大。从技术价值看,一个高效的字符串构建工具能显著提升日志输出、网络协议组装等场景的性能。通过设计基于模板和内部缓冲区的拼接引擎,可以实现编译时类型分发与内存预分配,从而减少不必要的拷贝和分配。应用场景广泛覆盖游戏日志、服务器消息处理等需要高性能输出的领域。本文聚焦的StringAppender

weixin_30266885的博客 314

9. C 语言 -- 循环结构:while语句和 do … while语句

本文主要讲述 C 语言循环结构中的 while 和 do while 语句,并且介绍了 scanf, getchar 和 gets三种输入的使用方法及使用情况。

dugudaibo的博客 1万+

STM32电子秤设计:HX711驱动、滤波算法与高精度标定实战

在嵌入式系统与物联网应用中,数据采集与处理是核心基础。其原理是通过传感器将物理量转换为电信号,再经模数转换器(ADC)变为数字量,供微控制器处理。这项技术的价值在于实现对现实世界的精确感知与数字化控制,是智能硬件、工业自动化等领域的基石。典型的应用场景包括环境监测、智能家居以及高精度的测量仪器,如电子秤。本文聚焦于电子秤这一经典应用,深入剖析如何利用STM32微控制器与HX711专用ADC芯片构建高精度称重系统。其中,数字滤波算法(如滑动平均滤波)和精准的标定流程是确保测量稳定性和准确性的关键,能有效解决数

diaoju3333的博客 456

C++数字转字符串全解析:从to_string到to_chars的性能与实战

在C++编程中,数据类型转换是基础且关键的操作,其中数字到字符串的转换尤为常见。其核心原理是将内存中的二进制数值按照特定格式规则序列化为可读的字符序列,这一过程涉及格式化、编码和内存管理。掌握高效的转换技术对提升程序性能、确保类型安全具有重要价值,尤其在日志系统、网络通信、数据序列化和用户界面渲染等应用场景中。本文聚焦于C++标准库提供的多种转换方案,深入探讨std::to_string的简洁易用与std::to_chars的极致性能,并结合实际工程需求,分析如何在sprintf、stringstream、

weixin_34377919的博客 366

PowerDesigner16.5下载和安装教程

一、软件下载 1.下载地址(不用复制,直接点击下载链接即可):链接:https://pan.baidu.com/s/1MSnWHWt3SO2Uz5dt9AANAg提取码:z9kk 二、软件安装 1.下载安装包(包含安装文件、汉化包、注册文件) 2.下载后文件内容如下 3....

cicong2374的博客 10万+

别再用Python卷了!用Matlab的Deep Learning Toolbox快速上手U-Net图像分割(附完整数据集处理代码)

本文介绍了如何使用Matlab的Deep Learning Toolbox快速上手U-Net图像分割,包括数据准备、网络构建、训练监控和模型应用等完整流程。Matlab的高度集成工具链和图形化界面为图像分割任务提供了更快捷、直观的解决方案,特别适合研究人员和工程师快速实现原型验证。

weixin_29927965的博客 381

手写strlen、strcpy、strcat、strcmp、strncpy:深入C字符串内存本质

C语言字符串并非独立类型,而是以'\0'结尾的char数组——这一底层事实决定了所有字符串函数的行为逻辑。其核心原理在于指针逐字节遍历、比较与复制,依赖显式空字符标记边界,而非长度字段。这种设计赋予了极致性能,也带来了缓冲区溢出、未终止字符串等典型安全风险。因此,理解strlen如何计数到'\0'、strcpy为何必须手动补'\0'、strncpy为何不自动终结,直接关系到嵌入式系统、网络协议栈及安全关键软件的稳定性。本文通过零依赖手写五大函数,还原内存直觉,覆盖边界处理、参数契约、返回值语义等工程实践要点

weixin_34319111的博客 335

数字摄影与摄像中的图像信号处理器(ISP):流程与经典算法详解

图像信号处理器(Image Signal Processor, ISP)是现代数字成像系统(如智能手机、数码相机、网络摄像头等)中的核心组件,扮演着将图像传感器(如CMOS或CCD)捕获的原始光电信号转换为高质量、可供观看或进一步处理的数字图像的关键角色。在数字摄影和摄像的整个链路中,光线首先通过镜头(Lens)聚焦到图像传感器上,传感器将光信号转换为模拟电信号,随后经过模数转换(A/D转换)变为原始的数字图像信号。

qq_44682523的博客 3723

C++字符串与整数互转:从基础到高性能优化的完整指南

类型转换是编程中的基础操作,涉及数据在不同表示形式间的安全与高效转换。其核心原理在于解析或格式化数字的字符序列,并处理进制、符号和边界条件。在C++中,正确的类型转换技术对程序健壮性和性能至关重要,尤其在处理用户输入、配置文件解析或网络数据传输时。本文通过分析`std::to_string`性能瓶颈和`std::stoi`异常处理等实际案例,深入探讨了从C风格函数到C++17现代工具的选择策略,并提供了高性能场景下的手工优化方案与工程实践封装,帮助开发者在不同应用场景下平衡安全与效率。

weixin_30787531的博客 339

基于Qt与PaddleOCR的跨平台OCR工具开发实战

本文详细介绍了基于Qt与PaddleOCR开发跨平台OCR工具的实战经验。通过Qt的跨平台特性和PaddleOCR的高效识别能力,开发者可以快速构建支持Windows、Linux和macOS的OCR工具。文章涵盖了环境配置、核心功能实现、性能优化及打包发布等关键环节,特别针对中文识别、内存管理和多线程处理等常见问题提供了解决方案。

weixin_30296405的博客 89

FoundationPose 4090部署 真实场景迁移

复现并应用foundationpose

m0_52835296的博客 613

2021-09-10

Notes about PAT1002AnalysisError/WarningSummary1003AnalysisError/WarningGapsSummary1004Analysis1005AnalysisGapError/Warning1006Analysis1007Analysis1008AnalysisError/Warning1009**Error/Warning**AnalyseGap101110121013101410151016101710181019Analysis102210231

hanahnnah的博客 269

DELL Precision T7920加装显卡遇到的坑

文章目录DELL Precision T7920加装显卡服务器原有配置介绍选购过程确认型号确认PCIE x16插槽确认电源功率和电源线安装过程电源模组线不够多单装一个3090显卡尺寸问题加装上1080Ti非常重要!官方文档 DELL Precision T7920加装显卡 实验室由于显卡计算能力不够,以及显卡显存不够,请老师花了大价钱购入了两张GeForce 3090显卡。老师赛高!记录一下这次加装显卡过程中学到的一些知识。 服务器原有配置介绍 服务器原有一张1080Ti显卡,一个16核Xeon CPU。

weixin_45520982的博客 1万+

StaticScript 编译器路线图与局限:现在能做什么,还缺哪些特性?

StaticScript 编译器是一个有趣且大胆的实验项目:它以 TypeScript 作为前端、LLVM 作为后端,目标是让带静态类型的 TypeScript 代码直接编译成原生可执行文件,而不是跑在解释器或 JIT 上。目前它已发布 0.7.0 版本,处于早期阶段。这篇 StaticScript 路线图与局限分析,会帮你快速搞清它现在能做什么、哪些场景适合使用,以及它还缺哪些关键特性。🚀

gitblog_00244的博客 499

从MCU到MPU:瑞萨RZN2L上手初体验,给Cortex-M工程师的Cortex-R52入门避坑指南

本文详细介绍了从MCU到MPU的过渡经验,特别是瑞萨RZN2L开发板的实战避坑指南。针对Cortex-M工程师转向Cortex-R52内核的挑战,文章深入解析了启动流程、内存管理、中断响应等九大本质差异,并提供了硬件设计陷阱和软件迁移的实用技巧,帮助开发者快速适应MPU开发环境。

weixin_29158413的博客 257

直击高频编程考点:字符串知识及经典算法题总结

字符串相关基本练习题总结(最长公共子串、最长回文子串、最长无重复字符子串、最小覆盖子串、字符串相乘、中文数字表达转实际数字格式等)

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 172万+

嵌入式开发中ASCII码的核心应用与高效处理技巧

字符编码是计算机系统信息表示的基础,其中ASCII码作为最经典的编码标准,定义了128个字符与数字的映射关系。其核心原理在于将英文字母、数字及控制符标准化,为设备间数据交换提供了通用语言。在嵌入式系统开发中,ASCII码的技术价值尤为突出,它不仅是串口通信、调试信息输出的载体,更是实现命令行接口、人机交互的基石。通过高效的字符串处理、内存优化策略,开发者能在资源受限的MCU上构建健壮的通信与交互功能。本文聚焦嵌入式场景,探讨ASCII码在固件开发中的实际应用,涵盖调试输出、协议解析、数据转换等关键环节,并针

weixin_30561177的博客 333

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C语言学习

C语言基础、指针、动态内存、结构体(位段)、联合体以及文件的学习

2601_94965056的博客 439

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C语言格式化隐藏技巧:用sprintf补零和空格,轻松搞定日志与界面对齐

本文深入探讨了C语言中`sprintf`函数的格式化隐藏技巧,重点介绍了如何使用补零和补空格实现日志与界面的完美对齐。通过实际代码示例展示了时间戳格式化、文本对齐等实用场景,并提供了构建安全高效日志系统的最佳实践,帮助开发者提升输出格式的一致性和可读性。

weixin_30314813的博客 303

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

深入解析C语言va_list:可变参数函数的底层原理与实战应用

在C/C++编程中,函数调用约定和栈内存管理是理解程序运行机制的基础。函数调用时,参数通过特定规则压入栈中,而可变参数函数则通过va_list机制在运行时动态访问这些参数。这一技术解决了函数接口灵活性的核心问题,使得开发者能够实现如printf、自定义日志库等需要处理不定数量参数的实用功能。其技术价值在于提供了底层系统编程的灵活控制能力,但同时也带来了类型安全和内存对齐等挑战。在实际应用场景中,va_list广泛用于日志记录、字符串格式化、调试工具等模块。本文通过分析va_list的底层实现,结合栈帧模型和

weixin_33146151的博客 291

【C++】C++ STL string 详解

本文详细介绍了C++ STL中的string类及其底层实现。主要内容包括:1) STL的六大组件(容器、算法、迭代器等)及其关系;2) string类的本质是字符数组,相比C字符串具有自动扩容等优势;3) string的历史渊源,它早于STL出现且接口设计存在冗余;4) string实际上是basic_string<char>的别名,支持不同字符编码类型;5) 深入解析ASCII、Unicode(UTF-8/16/32)和GBK等编码方案的区别,以及UTF-8兼容ASCII的特性。文章还比较了Windows

feng_qi0325的博客 415

深入解析printf性能瓶颈:从原理到实战的嵌入式与高性能计算优化策略

在C/C++开发中,标准I/O函数是调试和日志输出的基础工具,其性能直接影响程序效率。其原理涉及运行时格式解析、类型转换和系统调用,这些步骤在高频调用时可能成为性能瓶颈。从技术价值看,优化I/O操作能显著提升嵌入式系统、高频交易和游戏引擎等对延迟敏感场景的吞吐量。应用场景包括实时数据流处理、多线程日志记录和资源受限的嵌入式环境。本文聚焦于printf的性能损耗,通过分析其内部机制,提供从编译器优化到运行时习惯的全方位解决方案,帮助开发者在关键路径上实现高效输出,确保核心业务逻辑不受I/O操作拖累。

weixin_33979203的博客 439

嵌入式开发中整数模拟小数运算:定点数实现与优化实践

在嵌入式系统与单片机开发中,浮点数运算常因资源消耗大、速度慢而成为性能瓶颈。定点数运算作为一种高效的替代方案,通过引入缩放因子,用整数模拟小数,在保持确定性的同时大幅提升计算效率。其技术价值在于为资源受限的嵌入式设备提供了高精度、低功耗的数值计算能力,广泛应用于智能传感器、低功耗仪表等实时性要求高的场景。本文聚焦于定点数的核心原理,深入探讨了如何通过整数运算模拟小数处理,并针对ADC采样值转换等具体应用,给出了避免中间结果溢出的工程实践方案,其中涉及缩放因子选择与BCD码提取等关键热词。

weixin_30588675的博客 475

C语言十进制转二进制:从算法原理到工程实践

进制转换是理解计算机数据表示的基础,计算机内部使用二进制处理所有信息,而人类习惯的十进制需要转换为二进制才能被机器识别。其核心原理是通过除2取余法或位运算,将十进制数映射为0和1的序列。掌握这一转换过程对于深入理解内存布局、指针操作及位运算等底层概念至关重要。在工程实践中,需关注负数补码处理、输出格式控制及代码可移植性等常见陷阱。本文通过C语言实例,详细解析了除2取余法的实现细节与位运算的高效策略,并探讨了如何构建健壮的转换函数库,适用于系统编程、嵌入式开发及协议解析等场景。

weixin_30784501的博客 344

STM32软件模拟I2C驱动OLED屏:从时序到显存缓冲区的完整实现

在嵌入式系统开发中,I2C通信协议作为一种简单高效的双线串行总线,广泛应用于连接微控制器与各类传感器、存储器及显示模块。其工作原理基于主从架构,通过起始/停止信号、地址帧和数据帧实现设备间通信。软件模拟I2C技术,即利用通用GPIO口通过延时控制来模拟其时序,虽牺牲了部分速度,却换来了极佳的代码可移植性和调试可控性,尤其适合在早期STM32等MCU上规避硬件I2C外设的潜在稳定性问题。这项技术的核心价值在于,它让开发者能够以最基础的GPIO操作,灵活驱动如OLED显示屏这类低速外设,是掌握嵌入式底层通信和显

weixin_34014555的博客 422

嵌入式开发中sprintf浮点数转换异常的诊断与解决方案

在嵌入式系统开发中,C标准库的字符串格式化函数是基础且关键的工具。其工作原理涉及内存操作、类型转换和格式解析,尤其在处理浮点数时,需要特定的库函数支持以实现二进制到十进制的精确转换。这项技术的价值在于为调试、日志记录和数据通信提供了统一、便捷的文本输出接口。在资源受限的微控制器应用场景中,为了平衡功能与存储空间,工具链常提供精简版与全功能版库。若配置不当,例如在英飞凌DAVE™ IDE等集成环境中默认链接了精简库,就会导致`sprintf`处理`%f`格式符时输出乱码,这是嵌入式开发中一个典型的“幽灵”问题

weixin_30572613的博客 373
上一篇: 字符串翻转C语言实现
下一篇: C语言字符串Trim()函数的实现
Zevin
博客等级 码龄17年 63粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值