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