当前位置:网站首页>c语言 字符串的系列操作(字符串的逆序输出、字符串类型与int、double的互相转换)
c语言 字符串的系列操作(字符串的逆序输出、字符串类型与int、double的互相转换)
2022-07-13 17:51:00 【时而癫狂的匡匡】
1.字符串的逆序输出
c语言把字符串逆转看起来是一件非常简单的事情,就如同把数组逆序一样,本质上字符串就是一个char类型的数组,但是其中有不少的细节值得注意。
#include<stdio.h>
#include<string.h>
//参数char *str 不用const
void reverse(char *str){//不同于数组,不需要传递长度
size_t len = strlen(str);//长度
size_t i;//size_t可以理解为 unsiged int ,使用size_t可能会提高代码的可移植性、有效性或者可读性。
for(i=0;i<len/2;i++){
char temp;
temp = *(str+i);//当然你也可以使用中括号的形式。
*(str+i) = *(str+len-i-1);
*(str+len-i-1) = temp;
}
}
ok,函数已经写好了,只需要输入一个字符串即可调用。但大多数人都会直接用双引号(char *str = "Hello world!")这是字面值的定义存储在字面值常量区只读空间无法进行修改。
//主函数
int main(){
char str[20] = “Hello world!”;
reverse(str);
puts(str);//也可以用for循环逐个输出
}
2. int 转化为字符串类型
这个问题在c语言当中char的类型本质上就是int类型来存储的,下面这段代码就很好的说明问题。
#include<stdio.h>
int main(){
int i = 97;
char c = 'a';
printf("int i_d = %d\n",i);
printf("int i_c = %c\n",i);
printf("char c_d = %d\n",c);
printf("char c_c = %c\n",c);
return 0;
}
那么要把int 转化成字符串,无非就是将每一位放到字符串数组中去。但是输入的整数的正负号是一个要好好思考的点。
void int2str(int num,char *str){
int flag = num>0?1:-1;//判断正负
num = num*flag;//相当于取绝对值的过程,全部转化成正数处理。
int i=0;
while(num){
str[i++] = num%10+'0';//转化为int进行运算
//很显然这个结果是逆序的,那我们上面所作的字符串逆序就派上用场了
num/=10;
}
if(flag==-1){
str[i++] = '-'; //字符串长度要多预留1。
}
str[i] = '\0';
reverse(str);
}
3.字符串转int
有了int转字符串的经验,字符串转int应该能够得心应手。其中任然要注意正负号的问题,以及读取字符串结束的标志为读到‘\0’。
void str2int(char *str,int *num){// 你要改变主函数中的整数,应该操作该数的地址
assert(str!=NULL);// 断言这个字符串不为空。
int flag;
flag = *str=='-' ? 1:-1;
str = (*str=='-' || *str=='+')? ++str:str;
int n = 0;
while(*str){
assert(*str>='0' && *str<='9');
n = 10*n + (*str-'0');
++s;
}
n*=flag;//正负问题
*num = n;
}
4.字符串转化为double类型
这个问题无非就是如何处理小数点的问题,但是精度问题没法解决。
void str2double (const char *str,double *num){
assert(*str!=NULL);
int flag;
flag = *str=='-' ? 1:-1;
str = (*str=='-' || *str=='+')? ++str:str;
int doit = 0;//判断出现过小数点没
double n = 0;
assert(*s!='\0');
double m = 10;
while(*str){
if(*str=='.'){
++diot;
assert(diot<=1);
}else{
assert(*str>='0' && *str<='9');
if (idot){
n = n+(*s-'0')/m;
m*=10;
}else{
n = n*10 +(*s - '0');
}
}
++s;
}
n*=flag;//正负问题
*num = n;
}
边栏推荐
- HDU 1914 The Stable Marriage Problem (稳定婚姻匹配)
- 阅读论文——A cnn-rnn framework for crop yield prediction
- 第二章 SYN6288语音合成模块的使用
- About coursera
- js数组去重
- [missing session L5] command line environment (process control, TMUX, alias, configuration, SSH)
- KEIL中文乱码解决方法
- Transformer——注意力模型分析及应用
- RT_thread生产者与消费者问题
- 机器学习整理(几种学习方式的介绍)
猜你喜欢

Catching both gray and black swans: open set supervised anomaly detection

【CVPR2022】Multi-Scale High-Resolution Vision Transformer for Semantic Segmentation

DCGAN:DEEP CONVOLUTIONAL GENERATIVE ADVERSARIAL NETWORKS——论文分析

Dense contrast learning for self supervised visual pre training 2021

第六章 OLED模块+STM32的使用

Macro definition leads to incorrect result of ternary operation

Anti shake and throttling: practice and Corrigendum
![[paper notes] - gan-2014-nips](/img/2a/4955c2d3755b72eff1185bc0402621.png)
[paper notes] - gan-2014-nips

【論文筆記】—VGG網絡—2014-ICLR

常用学术文献数据库界面及导出参考文献方法
随机推荐
Customize breadcrumb navigation
【论文笔记】—毫米波雷达穿雾式高分辨率成像—Supervised—HawkEye系统—2020-CVPR
常用学术文献数据库界面及导出参考文献方法
YUV格式数据
[paper notes] - RESNET - 2015-cvpr
元素垂直居中
Redux source code analysis
js数组去重
【论文笔记】—AlexNet—2012-ACM
【论文笔记】—ResNet—2015-CVPR
目标检测(1)——数据预处理和数据集的切分
【ICCV2021】Tokens-to-Token ViT: Training Vision Transformers From Scratch on ImageNet
第六章 OLED模块+STM32的使用
研究小组19级硕士顺利通过论文答辩
Anti shake and throttling: practice and Corrigendum
Nine features of microservice architecture
[paper notes] - low illumination image enhancement - zeroshot - retinaxdip Network - 2021-tcsvt
【ARXIV2203】Efficient Long-Range Attention Network for Image Super-resolution
第四章 STM32+LD3320+SYN6288+DHT11实现语音获取温湿度数值(下)
【论文笔记】—GoogLeNet(Inception-V1)—2015-CVPR