利用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

通俗易通解释SLAM问题的数学描述:运动方程和观测方程

高翔博士在他的《视觉SLAM十四讲》中把SLAM问题的数学描述抽象成了两个数学方程,以下对此做个总结,并且对此做一些通俗易懂的解释: 一、方程的总体形式 作为理性层次的描述,我们引入数学方程来描述SLAM过程,其中第一个方程叫做运动方程、第二个方程叫做观测方程,想象一下我们在研究SLAM的时候肯定需要观测机器人(无人汽车、无人机等都可以统称为机器人)的运动(画面感很强哈哈),这样很容易理解并且记忆这两个方程的名称和意义: 二、变量的含义 我们看到,这两个方程中有大量的英文字母作为变量存在其中,下面介绍一下

weixin_41855010的博客 7114

使用Tansformer分割三维腹部多器官--UNETR实战

不会 transformer 没关系,本教程开箱即用。Tina姐总算对transformer下手了,之前觉得难,因为刚开始学序列模型的时候就没学会。然后就一直排斥学transformer。这两周没什么事,加上MONAI有现成的教程,就打算先跑通后,再学理论。然后,顺利的跑通了代码,再学了一周理论,发现它也不过如此嘛,入门还是很容易的。有同学想了解的transformer的话,可以先看完这个实战教程,如果感兴趣,后续会出一个transformer入门路线。利用纯Transformers作为编码器来学习输入量的

Tina姐的博客 1万+

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

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

weixin_34319111的博客 335

OCR开发车架号识别vin码识别系统

一、vin码识别车架号识别系统简介   vin码识别车架号识别系统,结合VIN码主机厂数据库及自身多年文字识别经验,针对机动车配置参数等信息的查询及采集业务推出的一款VIN码自动识别产品。   车架号识别vin码识别,主要应用在智能手机IOS与Android两个平台中。前端扫描查询模式,无需联网,只需扫描汽车前挡风玻璃右下角的VIN玛(车架号),即可轻松识别出车辆产地、品牌、车

OCR13512721355的博客 1433

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

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

weixin_30787531的博客 339

自制温湿度计——STM32-L432KC驱动lcd1602和dht11温湿度显示

先给大家甩一张图片哈(附上网址)简单说一下这块板子在这个小项目里的小缺点:一、引脚有点少,lcd1602本来有两种传输数据方式,一种是4bit,另一种是8bit,但是这块板子对于这个项目来说引脚有点少,所以建议用4bit模式。然而,在网上是很难找到设置4bit传输模式的lcd1602的,这也是为什么我写这个blog。二、mbed-os有时候会有大大小小的问题,搞人心态是真的。比如库函数离奇失踪,从官网上下载库函数失败,重装也解决不了然后莫名其妙好了。

m0_72994251的博客 3912

ethercat linux lan9252 - lan9253调试

linux 的ethercat测试

linsheng_111的专栏 1934

2021-09-10

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

hanahnnah的博客 269

因果推断(二):因果推断涉及的ITE、ATE、CATE等效应

因果效应也称为**处理效应(Treatment effect)**是用于评判干预与否的结果差异的指标(处理变量对结果变量的影响)。比如在接受治疗组中,如果这些人不接受治疗,这组人接受治疗和不接受治疗的效应差异是多少。定义为实验组中每个个体的处理效应差异,比如一个个体在接收治疗和不接受治疗的两个处理方式的健康程度得分的差。但是一个人因为不可能。比如我们想探究接受治疗的男性用户和不接受治疗的男性用户的平均效果差异就是CATE。前面说ITE是无法观测的,是因为一个人不能同时接受治疗又不接受治疗,这里关键的就是。

Y1n的博客 3713

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

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

gitblog_00244的博客 499

Vue3 - Vite运行打包时Uncaught ReferenceError: process is not defined(解决vue3+vite报错process is not defined)

vue3,vite,vue3+vite报错,process,UncaughtReferenceError:processisnotdefined,浏览器控制台报错processisnotdefined解决方法,vue3如何解决报错,vite报错怎么办,前端打包UncaughtReferenceError:processisnotdefined,npmrunbuild打包报错,vite打包时出现错误,vue3打包运行找不到process,热更新会报错UncaughtRefer

🏆 前端领域优质创作者 7737

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

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

weixin_30561177的博客 333

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C语言学习

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

2601_94965056的博客 439

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

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

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

weixin_30314813的博客 303

深入解析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、付费专栏及课程。

余额充值