镜缘浮影 小人本住在 苏州的城外 家里有屋又有田 生活乐无边

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

2016-11-21
wilmosfang
c
原文地址 http://soft.dog/2016/11/21/c-basic-05/

前言

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


概要


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

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

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

代码注解

直接求解

#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;	
}

数组翻转

#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
}

指针实现

#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;
}

思路

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

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

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

基础知识点

  • 数组的定义
  • 宏定义
  • 循环控制
  • 格式输入输出
  • 字符串函数的使用
  • 指针的定义
  • 指针的计算与使用
原文地址 http://soft.dog/2016/11/21/c-basic-05/

评论