C语言字符串基本操作

在 C 语言中,字符串是由数字、字母、下划线组成的一维字符数组,并且使用 null 字符 '\0' 作为终止符号。字符串在存储上类似字符数组,所以它每一位的单个元素都是可以提取的,如s=“abcdefg”,则s[0]=“a”,s[1]="b"。

字符实际上是以对应的ASCII数值的形式在内存中存储的。 对一个字符强制转换成int类型,得到的就是该字符的ASCII码。

字符与字符相减,其实就是它们对应的ASCII码相减,得到的是它们的ASCII码之间相差的距离。

C中函数返回字符串的4种方法

函数返回字符串的两个条件 1. 返回一个字符串地址(首地址), 2. 保证这块地址的内存空间不会随着函数退出而销毁
1.将字符串指针作为函数参数传入,并返回该指针
2.使用malloc申请的堆空间,返回申请的堆地址,注意释放
3.返回一个static定义的静态局部变量
4.使用全局变量


1.  将字符串指针作为函数参数传入,并返回该指针

这种方法一般在函数内复制一份该字符串指针的首地址,通过它操作首地址指向的元素,及其后边的元素,这样操作 就相当于直接操作原始字符串内容。例如strcpy函数:


char* strcpy(char* des,const char* source)
  {
      char* r=des;
      assert((des != NULL) && (source != NULL));
      while((*r++ = *source++)!='\0');
      return des;
  }

2. 使用malloc函数动态分配内存,函数可以返回该内存地址

malloc申请的内存位于堆上,不会被系统自动释放掉,可以从函数中返回,但是切记要在主调函数中使用free主动释放该空间。


#include <stdio.h>
  #include <string.h>
  #include <stdlib.h>

char * return_Pchar_malloc()
  {
      char * str2;
      str2 = (char *)malloc(10);
      strcpy(str2,"Hello!");
      return str2;
  }

int main()
  {
      char * str1;
      str1 = return_Pchar_malloc();
      printf("%s\n",str1);
      //记住一定要用free释放,否则会造成内存泄露
      free(str1);
      return 0;
  }


3. 返回一个静态局部变量

使用static修饰的静态变量存放位置是在全局数据区,在主程序运行的整个生命周期中都存在,不会随着函数的退出而销毁。


#include <stdio.h>
  #include <string.h>
  #include <stdlib.h>

char * return_Pchar_static()
  {
      static char str2[10];
      strcpy(str2,"Hello!");
      return str2;
  }

int main()
  {
      char * str1;
      str1 = return_Pchar_static();
      printf("%s\n",str1);   
      return 0;
  }


4. 使用全局变量

全局变量是老大,没啥说的。

那么可否在函数中返回一个常量字符串指针?如下:


#include<stdio.h>
 #include<stdlib.h>
 #include<string.h>

char* return_pstr(){
    char* str = "HELLO";
    return str;
 }

int main(){
    char * str = return_pstr();
    printf("%s\n",str);
 }

答案是可以的,但也是危险的!

字符常量位于静态数据区里的文字常量区,生命周期是整个函数,但是字符常量是只读的,任何尝试修改字符常量的操作都会导致运行错误。


1. 数字转换成字符串、 字符串转换成数字


#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//数字转换成字符串
void itoa(int num,char* str){
    int i=0,length=0,temp=0;
   
    while(num>0){
        str[i]=num%10+'0'; //数字+'0'转换成字符
        i++;
        num=num/10;
    }
    str[i]='\0';
   
    length = strlen(str);
    //字符逆序,注意终止条件是长度的一半
    for(int j=0;j<length/2;j++){
        temp = str[j];
        str[j] = str[length-j-1];       
        str[length-j-1] = temp;
    }
}

//字符串转换成数字
int char_to_num(char* str){
    int i=0, temp = 0;
    while(str[i]){
      temp = temp*10+(str[i]-'0');
      i++;
    }
    return temp;
}
 
int main(){ 
    int num = 12343245;
    int c_n;
    char str[10];
    itoa(num,str);
    c_n = char_to_num(str);
    printf("%s\n",str);
    printf("%d\n",c_n); 
    return 0;
}


 2. 实现 strcpy 字符串复制


#include<stdio.h>
#include<stdlib.h>
#include<string.h>

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/9b11db595636b160d24a02b63e763314.html