前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >那些年我们一起忘掉的C (五).字符串翻转

那些年我们一起忘掉的C (五).字符串翻转

作者头像
franket
发布2021-10-18 10:53:07
2240
发布2021-10-18 10:53:07
举报
文章被收录于专栏:技术杂记

前言

对字符串的存储加工处理和对指针的使用都是重要的基础


概要


将输入的字符串按反序输出

写一个程序,将输入的字符串按反序输出

例如:给定输入为abcde,输出结果为edcba

代码注解

直接求解
代码语言:javascript
复制
#include <stdio.h>
#include <string.h> //引入string.h头文件,就可以使用其中预定义的函数
#define LENGTH 40 //定义一个名为LENGTH的宏,它代表40,#define 用来进行宏定义,编译系统会在编译之前将程序中所有的LENGTH替换为40,因为是发生在编译之前,所以也叫预处理,或预编译

main() //系统将不带类型的main函数,默认为int类型
{
	int len,i; //定义两个整型变量,len用来存字符串长度,i用来进行循环控制
	char s[LENGTH]; //定义一个字符数组,用来装输入的内容
	printf("please input a string (less then %d chars):\n",LENGTH); //终端提示输入一个字符串,这里用到了前面定义的宏LENGTH,它在编译前就会被直接替换成40
	scanf("%s",s); //将结果保存到字符数组s中,这里的数组名s同时也是指向s[LENGTH]的地址,scanf是系统提供的函数,用来从标准输入中获取数据,scanf("格式",地址),第一个参数是一个代表格式的字符串,后面的是一个地址列表,将获取的数据存放到这个列表所指的空间中
	len=strlen(s); //获取字符串s的长度,并且保存到len中,准确来讲s是字符数组的数组名,代表的是首个元素的地址,但是里面保存了一个以'\0'结尾的字符数组,strlen会计算这个字符数组中字符的个数
	for(i=len-1;i >= 0; i--) putchar(s[i]);	//i的初值赋为len-1,在[len-1,0]的范围里,i会逐一递减,作为下标,s[i]会从最后一个字符开始逐一遍历到第一个元素,并且使用purchar将它在标准输出中打印出来
	putchar('\n'); //在标准输出中进行一次换行
	return 0;	
}
数组翻转
代码语言:javascript
复制
#include <stdio.h>
#include <string.h>
#define LENGTH 40

main()
{
	int len,i; //定义两个整型变量,len用来存放字符串长度,i用来进行循环控制
	char c[LENGTH],tmpc; //定义一个长度为LENGTH的字符数组c和一个临时存储的tmpc
	printf("please input a string (less then %d chars):\n",LENGTH); //提示输入一个字符串
	scanf("%s",c); //从标准输入中读取内容并且保存到c所指向的字符数组中
	len=strlen(c); //计算出字符串长度,并且保存到len中
	for(i=0;i < len/2;i++) //i赋初值0,在[0,len/2]的范围里i会逐一递增进行遍历
	{
		tmpc=c[i];  
		c[i]=c[len-1-i];
		c[len-1-i]=tmpc; //将i号元素与倒数i号元素的值进行对调
	}
	printf("the rev string is :%s\n",c); //输出现在字符数组中的内容,c是数组名,代表数组的首元素地址
	return 0;  //由于main没有指明类型,所以默认为int型,而int型要求有返回值,这里return 0就是给出来main的返回值为0
}
指针实现
代码语言:javascript
复制
#include <stdio.h>
#include <string.h>
#define LENGTH 40

main()
{
	char s[LENGTH],t[LENGTH],*sp,*tp; //定义两个长度为LENGTH的字符串数组,两个字符指针,s用来装输入内容,t用来装翻转内容
	sp=s;				//将sp指向s数组的起始位置
	printf("please input a string (less then %d chars):\n",LENGTH);
	scanf("%s",sp);		//将输入的内容保存到sp所指示的字符数组中,即s[LENGTH]数组中
	tp=t;			//将tp指向t数组的起始位置
	tp+=strlen(sp); //计算出sp字符串的长度,将tp指针移动一样多的位置,因为是从零号元素开始的,这样就指向了第n+1个元素
	*tp='\0';		//在最后添加一个字符串结束符
	for(tp--;*sp != '\0';sp++,tp--)	*tp = *sp; //sp会从头到尾逐一遍历s数组中的元素,并将相应元素值赋给tp指向的t数组元素,而tp是根据sp中的元素个数在t数组中进行逆序摆放
	tp++;			//伴随sp指针的移动,tp会自减过头,经过++的操作就重新指向了t数组的起始位置
	printf("the rev string is :%s\n",tp);
	return 0;
}

思路

不论如何操作,要先将输入的内容进行保存

然后就是想办法逆序遍历每个元素,并且直接输出

或进行保存,可以在原来的基础上直接进行变更,或者将结果拷贝到新的存储空间中来

基础知识点

  • 数组的定义
  • 宏定义
  • 循环控制
  • 格式输入输出
  • 字符串函数的使用
  • 指针的定义
  • 指针的计算与使用

原文地址

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 概要
    • 将输入的字符串按反序输出
      • 代码注解
      • 思路
      • 基础知识点
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档