c语言--字符串

1.字符串

表现形式:char ch[5]={'a','b','c','d','e'};

注意点:

         双引号括起来

         每个字符占用一个字节

         以'\0'表示字符串结束

 

int main(int argc, const char * argv[])
{
    char str[100]="hahahaha\0wewewe\0helloworld";
    printf("%s\n",str);
    printf("%s\n",&str[9]);
    printf("%s\n",&str[16]);
    return 0;
}

 1.1字符串长度

注意点: 

        字符串有效长度不包含'\0'

        sizeof 是一个运算符, 求变量或者常量占用内存空间大小

        strlen是一个函数, 求字符串有效字符个数

 

int mystrlen(const char * src)
{
    int i=0;
    while (src[i]!='\0') {
        i++;
    }
    return i;
}

int main(int argc, const char *argv[])
{
    char str[100]="hello world";
    printf("%d \n", mystrlen(str));//调用函数求出长度
    printf("%ld \n", sizeof(str));
    printf("%ld \n", sizeof("hello world"));
    printf("str == %ld \n", strlen(str));
    return 0;
}

 1.2字符串拷贝(复制)

函数:

   strcpy:

   char *strcpy(char *, const char *);

   strncpy:

   char *strncpy(char *, const char *, size_t);

注意点:

        s1的内存空间足够容纳s2字符串

        strncpy 选择拷贝的字节数, 不一定包含'\0';

//自定义拷贝函数
char *mystrcpy(char *dst, const char *src)
{
    int i =0;
    while (src[i]) {
        dst[i]=src[i];
        i++;
    }
    dst[i]='\0';
    return dst;
}
int main(int argc, const char *argv[])
{
    char s1[100];
    char s2[50]="hello world\n";

    //char *str = strcpy(s1, s2);
    //printf("%s\n",strcpy(s1, s2));
    //printf("%s\n",str);
    //printf("%s\n",mystrcpy(s1, s2));

    strncpy(s1, s2, 10);
    s1[10]='\0';
    printf("%s\n", s1);
    
    return 0;
}

 1.3字符串拼接

函数:

   strcat:

   char *strcat(char *, const char *);

   strncat:

   char *strncat(char *, const char *, size_t);

   strncat在拼接后的新字符串后会添加一个'\0';

 

//自定义拼接函数
char *mystrcat(char *s1, const char *s2)
{
    int i=0,j;
    while (s1[i]) {
        i++;
    }
   //循环拼接操作
    for (j=0; s2[j]!='\0'; j++) {
        s1[i+j]=s2[j];
    }
    s1[i+j]='\0';
    return s1;
}
int main(int argc, const char *argv[])
{
    char s1[100]="hello world";
    char s2[50]="wearefriend";
    
    //printf("%s\n",strcat(s1, s2));
    //printf("%s\n",mystrcat(s1, s2));

    printf("%s\n",strncat(s1, s2, 5));
    
    return 0;
}

 1.4字符串比较函数

函数:

strcmp:

   int strcmp(const char *, const char *);

strncmp:

   int strncmp(const char *, const char *, size_t);

 s1 > s2 返回一个正数

 s1 == s2 返回0

 s1 < s2 返回一个负数

 

//自定义比较函数
int mystrcmp(const char* s1, const char *s2)
{
    int i;
    //循环判断到字符串结尾处
    for (i=0; (s1[i]!='\0')&&(s2[i]!='\0') ; i++) {
        if (s1[i]==s2[i]) {
            continue;
        }
        else
        {
            break;
            //return  s1[i]-s2[i];
        }
    }
    //返回一个比较数
    return s1[i]-s2[i];
}
int main(int argc, const char *argv[])
{
    char *str1 = "borld";
    char *str2 = "zorld";
    
    //printf("%d\n", mystrcmp(str1, str2));
    printf("%d\n", strncmp(str1, str2, 7));
    //char s1[30]="hello world";
    
    return 0;
}

 1.5字符串查找

函数:

strchr:

   char *strchr(const char *, int);

strrchr:

   char *strrchr(const char *, int);

 

char *mystrchr(const char *s1, char ch)
{
    int i=0;
    while (s1[i]) {
        if (s1[i]==ch) {
            break;
        }
        i++;
    }
    return (char *)&s1[i];
}
int main(int argc, const char *argv[])
{
    char str[100]="hello world!";
    
    char *pstr = mystrchr(str, 'l');
    printf("%s\n", pstr);
    //printf("%s\n", pstr);

    return  0;
}

 1.6查找字符串

函数:

strstr:

   char *strstr(const char *, const char *);

int main(int argc, const char *argv[])
{
    char str1[100]="helloworld helloworld";
    printf("%p\n",&str1[strlen(str1)]);

//    char *pstr = strstr(str1, "world");
//    printf("%s\n", pstr);

    char *p = str1;
    while ((p=strstr(p, "world"))) {
        if (p) {
            printf("%s\n", p);
            p+=sizeof("world")-1;
        }
    }
    return 0;
}

 1.7字符串分割

函数:

strtok:

   char *strtok(char *, const char *);

 

int main(int argc, const char *argv[])
{
    char str[100]="hello world:good-bye:://we^are..friend()ok///";
//    char *p=strtok(str, ": ");
//    printf("%s\n",p);
//    while ((p=strtok(NULL, ": /^.()-"))) {
//        printf("%s\n",p);
//    }
    char *p = str;
    while ((p=strtok(p, ": /^.()-")))
    {
        printf("%s\n",p);
        p=NULL;
    }
//    p = strtok(NULL, ":");
//    printf("%s\n",p);
    return 0;
}

 eg.按照空格来分割字符串得到单词数量(不使用系统函数)

int main(int argc, const char *argv[])
{
    char str[200];
    scanf("%[^\n]",str);
    int i=0;
    int flag=1;//标志位
    int cnt=0;//统计数量
    while (str[i]!='\0') {
        if (str[i]==' ') {
            if (!flag) {
                flag = 1;
            }
        }
        else
        {
            if (flag) {
                cnt++;
                flag =0;
            }
        }
        i++;
    }
    printf("%d\n", cnt);

    return 0;
}

 

posted @ 2014-12-13 17:26  sublimter随想博客  阅读(223)  评论(0编辑  收藏  举报