字符串的初始化方法
1、char str[10] = { 'H', 'e', 'l', 'l', 'o', '\0' };
2、char str[10] = "Hello";
   char str[] = "linguoyuan\n";

字符串处理在程序中很常见,C库也提供了很多字符串的处理函数,它们有一个共同特点就是都要包含头文件string.h。
1、计算字符串长度:strlen、sizeof
头文件:string.h
格式:strlen (字符数组名)
功能:计算字符串s的(unsigned int型)长度,不包括'\0'在内
说明:返回s的长度,不包括结束符'\0'。

与此有点类似有sizeof,但它和strlen函数不一样,它只是一个操作符,而且sizeof()返回的是所声明的变量的内存大小,eg:char str[10] = "lin"; strlen(str)返回3,而sizeof(str)返回的是10。

上面是对静态数组处理的结果,如果是对指针,结果就不一样了
char* ss = "0123456789";
sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针,sizeof 获得的是一个指针的之所占的空间,应该是
长整型的,所以是4
sizeof(*ss) 结果 1 ===》*ss是第一个字符其实就是获得了字符串的第一位'0' 所占的内存空间,是char类型的,占了 1 位
strlen(ss)= 10 >>>> 如果要获得这个字符串的长度,则一定要使用 strlen
sizeof返回对象所占用的字节大小.
strlen返回字符个数.

所以注意下面的情况:
(1)
char Array[3] = {'0'};
sizeof(Array) == 3;
char *p = Array;
sizeof(p) == 1;//sizeof(p)结果为4
在传递一个数组名到一个函数中时,它会完全退化为一个指针
(2)
char q[]="abc";
char p[]="a\n";
sizeof(q),sizeof(p),strlen(q),strlen(p);
结果是 4 3 3 2

2、复制字符串函数:strcpy、strncpy、memcpy、memmove

(1)原型:char *strcpy(char *dest,char *src);
头文件:string.h
功能:把从src地址开始且含有NULL结束符的字符串赋值到以dest开始的地址空间
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。

(2)strncpy与strcpy的不同之处就是带一个参数指定最多拷贝多少个字节。

(3)
void *memcpy(void *dest, const void *src, size_t n);
memcpy函数从src所指的内存地址拷贝n个字节到dest所指的内存地址,和strncpy不同,memcpy并不是遇到'\0'就结束,而是一定会拷贝完n个字节。注意:src和dest所指内存区域不能重叠,函数返回指向destin的指针
void *memmove(void *dest, const void *src, size_t n);
memmove也是从src所指的内存地址拷贝n个字节到dest所指的内存地址,虽然叫move但其实也是拷贝而非移动。但是和memcpy有一点不同,memcpy的两个参数src和dest所指的内存区间如果重叠则无法保证正确拷贝,而memmove却可以正确拷贝。

3、比较字符串:strcmp、memcmp、strncmp
(1)strcmp
功能:比较字符串s1和s2。
原型:strcmp(const char *s1,const char * s2)
当s1<s2时,返回值<0
当s1=s2时,返回值=0
当s1>s2时,返回值>0
两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。
以下是一个实现strcmp的例子:
#include<stdio.h>
int mystrcpy(char s1[],char s2[])
{
    int i;
    for(i=0;s1[i]==s2[i];i++)
        if(s1[i]=='\0')
            return 0;
    if(s1[i]-s2[i]>0)
        return 1;
    else
        return -1;
}
int main(int argc,char*argv[])
{
    char s1[]="linguoyuan";
    char s2[]="xingwenpeng";
    int i=mystrcpy(s1,s2);
    printf("%d\n",i);
    return 0;
}

(2)memcmp从前到后逐个比较缓冲区s1和s2的前n个字节(不管里面有没有'\0'),如果s1和s2的前n个字节全都一样就返回0,如果遇到不一样的字节,s1的字节比s2小就返回负值,s1的字节比s2大就返回正值。

(3)strncmp与strcmp的唯一区别是即使两个字符串还没遇到'\0',比较到了n个字符,也已样返回。

4、连接字符串:strcat、strncat
原型:
char *strcat(char *dest, const char *src);
char *strncat(char *dest, const char *src, size_t n);
返回值:dest指向哪,返回的指针就指向哪
strcat把src所指的字符串连接到dest所指的字符串后面
char d[10] = "foo";
char s[10] = "bar";
strcat(d, s);
printf("%s %s\n", d, s);

调用strcat函数后,缓冲区s的内容没变,缓冲区d中保存着字符串"foobar",注意原来"foo"后面的'\0'被连接上来的字符串"bar"覆盖掉了,"bar"后面的'\0'仍保留。

strcat和strcpy有同样的问题,调用者必须确保dest缓冲区足够大,否则会导致缓冲区溢出错误。strncat函数通过参数n指定一个长度,就可以避免缓冲区溢出错误。注意这个参数n的含义和strncpy的参数n不同,它并不是缓冲区dest的长度,而是表示最多从src缓冲区中取n个字符(不包括结尾的'\0')连接到dest后面。如果src中前n个字符没有出现'\0',则取前n个字符再加一个'\0'连接到dest后面,所以strncat总是保证dest缓冲区以'\0'结尾,这一点又和strncpy不同,strncpy并不保证dest缓冲区以'\0'结尾。所以,提供给strncat函数的dest缓冲区的大小至少应该是strlen(dest)+n+1个字节,才能保证不溢出。(这是宋老师书的例子)。

5、搜索字符或字符串:strchr、strrchr
原型:
char *strchr(const char *s, int c);
char *strrchr(const char *s, int c);
返回值:如果找到字符c,返回字符串s中指向字符c的指针,如果找不到就返回NULL

strchr在字符串s中从前到后查找字符c,找到字符c第一次出现的位置时就返回,返回值指向这个位置,如果找不到字符c就返回NULL。strrchr和strchr类似,但是从右向左找字符c,找到字符c第一次出现的位置就返回

char *strstr(const char *haystack, const char *needle);
返回值:如果找到子串,返回值指向子串的开头,如果找不到就返回NULL
strstr在一个长字符串中从前到后找一个子串(Substring),找到子串第一次出现的位置就返回,返回值指向子串的开头,如果找不到就返回NULL。

6、分割字符串:strtok
char *strtok(char *str, const char *delim);
参数str是待分割的字符串,delim是分隔符
以下是一个使用strtok来一个字符串分割成整数:
#include <stdio.h>
#include <string.h>

void main(void)
{
    char a[1024];
    int b;
    char* c;
    fgets(a,sizeof(a),stdin);
    b = atoi(strtok(a," "));
    printf("%d\n",b);
    while( (c = strtok(NULL," "))  != NULL )
    {  
        b = atoi(c);
        printf("%d\n",b);
    }
}
注意:
strtok函数中有一个静态指针变量记住上次处理到字符串中的什么位置,所以不需要每次调用时都把字符串中的当前处理位置传给strtok。

下面是一些平时练习字符串的例子。

////////删除字符串里的某一个字符///////////
1 #include<stdio.h>

2  void delet_char(char*str,char ch)
3  {
4   int i,j;
5   char s[3]; 
6   for(i=j=0;str[i];i++)
7       if(str[i]!=ch)
8           s[j++]=str[i];
9   printf("%s\n",s);  
10 }
11 int main(int argc,char*argv[])
12 {   
13 char ch='b';
14  char str[]="abc";
15
16  printf("%s\n",str);
17  delet_char(str,ch);
18
19  return 0;
20  }

//////////////////////////////////////////
1
2 #include<stdio.h>
3 int main(int argc,char*argv[])
4 {
5         char a,b;
6         int i=0;
7         int j;
8
9         a=getchar();
10         char buf[10];
11
12         while(a!='\n')
13         {
14                 buf[i]=a;
15                 a=getchar();
16                 i++;
17         }
18         buf[i]='\0';
19         printf("shuru:%s\n",buf);
20
21         for(j=i-1,i=0;i<j;j--,i++)
22         {
23                 b=buf[j];
24                 buf[j]=buf[i];
25                 buf[i]=b;
26         }
27         printf("shuchu:%s\n",buf);
28 }

//////////三种方法实现字符串复制////////////
1  #include<stdio.h>
2  #include<string.h>
3
4  int main(int argc,char*argv[])
5  {
6   char s1[]="Hello World!";
7   char s2[20];
8   int i=0;
9
10  while(s1[i])
11      s2[i++]=s1[i];
12  s2[i]='\0';
13  printf("while:%s\n",s2);

14  for(i=0;i<strlen(s1);i++)
15      s2[i]=s1[i];
16  printf("for:%s\n",s2);

17  strcpy(s2,s1);
18  printf("strcpy:%s\n",s2);
19  return 0;
20 }                         
/////////////////mystrncpy/////////////
1  #include<stdio.h>
2  #include<string.h>
3  #include<stdlib.h>
4  #define N 20

5  char*my_strncpy(char dest[],char src[],int count)
6  {
7     char*tmp = dest;  //注意传进来的是地址
8     if(count<=0||N<count)
9     {
10        printf("Usage count or Space not enough!\n");
11        return NULL;
12    }
13    while(count&&(*tmp = *src))
14    {
15        tmp++;
16        src++;
17        count--;
18    }
19    printf("count=%d\n",count);
20    if(count)
21        while(count)
22        {
23            printf("in while,count=%d\n",count);
24            *tmp++ = '\0';
25            count--;
26        }
27    return dest;
28  }
29
30  int main(int argc,char*argv[])
31  {
32    char dest[N] = {'\0'};
33    char src[15] = "Hello!";
34    if(argc!=2)
35    {
36        printf("You need input a number!\n");
37        return 0;
38    }
39    printf("After my_strncpy,dest=%s\n",my_strncpy(dest,src,atoi(argv[1])));
40    return 0;
41  }

////////////////将字符串中的某个字母转化为大写字母//////
1 #include<stdio.h>
2 #define N 20
3 int main(int argc,char*argv[])
4 {
5     char a[N]="I like this game";
6     int num=0;
7     int i;
8     for(i=0;i<N;i++)
9        if(a[i]>='a'&&a[i]<='z'&&a[i]=='g')
10       {
11          a[i]='g'-32;
12          num++;
13       }
14    if(num)
15      printf("After converse,the new string:%s\n",a);
16    else
17      printf("Has not character'e'need to converse!\n");
18    return 0;
19 }

char[] 操作的更多相关文章

  1. C语言:char[]操作

    C语言中char[]的操作函数1.赋值操作在C语言中,char型数组是不可以直接赋值的.例如在如下的代码中,会得到错误: char c1[20] = "women";char c2 ...

  2. Java中的字符串操作(比较String,StringBuiler和StringBuffer)

    一.前言 刚开始学习Java时,作为只会C语言的小白,就为其中的字符串操作而感到震撼.相比之下,C语言在字节数组中保存一个结尾的\0去表示字符串,想实现字符串拼接,还需要调用strcpy库函数或者自己 ...

  3. Java的字符串操作

    目录 Java的字符串操作 一.不同字符串操作的对比 1.1 C++中const修饰指针 const在星号的左边,是被指向的常量不可变 const在星号的右边,是指针的指向不可变 二. Java字符串 ...

  4. [转载]Java数组扩容算法及Java对它的应用

    原文链接:http://www.cnblogs.com/gw811/archive/2012/10/07/2714252.html Java数组扩容的原理 1)Java数组对象的大小是固定不变的,数组 ...

  5. Java 基础知识总结 (四、String)

    四.String public final class String extends Object implements Serializable, Comparable<String>, ...

  6. CC2540 USB Dongle 使用说明

    CC2540做的USB Dongle可以烧写不同的固件从而做很多PC端的应用,下面我们来介绍下下载固件的方法和一些典型应用: 下载接口: 3V3引脚连接到CC Debugger的Target Volt ...

  7. 慕课网:C++ & 数据结构

    课程链接:james_yuan的课程 这部分太枯燥了,如果教材难度稍大,根本就学不下去,所以就先看看通俗的视频吧. 课程目录 1.C++远征之起航篇 - C++亮点尽在其中 2.C++远征之离港篇 - ...

  8. String类、正则表达式

    一.String类  String使用非常频繁,用来描述一个字符串.String中实现了很多  对字符串方便的操作方法.  String内部使用char[]实现字符串的数据保存    字符串的&quo ...

  9. java学习笔记(3)——面向对象

    this关键字 this是当前对象的引用,是运行期间当前对象本身. 可以使用this明确的访问当前对象的属性或者方法,类似于“我” this()可以调用本类的其他构造器,可以使用构造器的重用简化代码的 ...

随机推荐

  1. Notes of the scrum meeting(11/2)

    meeting time:13:00~13:30p.m.,November 2nd,2013 meeting place:3号公寓楼一层 attendees: 顾育豪                  ...

  2. android开发,静音录制视频,在一般清晰度的前提下保证文件大小越小越好

    public void startRecord() { mediarecorder = new MediaRecorder();// 创建mediarecorder对象 mCamera = getCa ...

  3. 浏览器不支持HTML5

    有些浏览器并不支持HTML5中的新增元素,如IE8或更早版本.想要应用样式,可以头部标记<head>中加入下面JavaScript代码 <html> <head> ...

  4. Google Guava学习笔记——基础工具类Joiner的使用

    Guava 中有一些基础的工具类,如下所列: 1,Joiner 类:根据给定的分隔符把字符串连接到一起.MapJoiner 执行相同的操作,但是针对 Map 的 key 和 value. 2,Spli ...

  5. python+selenium浏览器调用(chrome、ie、firefox)

    代码: #coding=utf-8 from selenium import webdriver driver=webdriver.Chrome() #调用chrome浏览器 driver.get(' ...

  6. 浅谈自我对git的初步认识

    本学期我们新增了一门课程,那就是软件工程,不知道为什么,感觉有种莫名的高大上.哈哈!难道是这个名称太抽象了吗?这个问题我感觉到后来肯定就明白了. 第一次博客,感觉好紧张哦,嘿嘿!老师让我们谈谈对git ...

  7. 【BZOJ】【1150】【CTSC2007】数据备份Backup

    堆/贪心 一共N-1个元素……用堆维护最大值,取了第x个元素以后,插入v[x-1]+v[x+1]-v[x]这个元素,如果再取这个新元素就表示不取x,而取x-1和x+1……大概就是这种“带反悔”的思路吧 ...

  8. 【BZOJ】【1912】【APIO2010】patrol巡逻

    树形DP 说是树形DP,其实就是求树的最长链嘛…… K=1的时候明显是将树的最长链的两端连起来最优. 但是K=2的时候怎么搞? 考虑第一次找完树的最长链以后的影响:第一次找过的边如果第二次再走,对答案 ...

  9. JDBC数据库连接池原理

    JDBC是java数据库连接的简称.它是一种用于实行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用java语言编写的类和接口组成.其相关的API都在java.sql.*包下 ...

  10. TestDriven.Net

    转: http://www.cnblogs.com/AlexLiu/archive/2008/12/01/1345002.html