字符型数据/字符串数据

字符型数据包括字符常量和字符变量。

字符常量   -- %c  char占8位

字符常量是用单引号括起来的一个字符。

例如:'a'、 'b' 、'='、'+'、 '?'

都是合法字符常量

在c语言中, 字符常量有一下特点:

1)字符常量只能用单引号括起来, 不能用双引号或其他括号。

2)字符常量只能是单个字符, 不能是字符串

3)字符可以是字符集中任意字符。 但数字被定义字符型后不能参与运算, 如5 和'5'

字符变量 ---不全等看完c plus在补充

字符变量用来存储字符常量, 即单个字符。

字符变量的类型说明符是char。字符变量类型定义的格式和书写规则都与整形变量相同。

例如:

 

 

#include <stdio.h>

int main(){
    char ch;
    int len = 0;
    printf("Enter a message: ");
    ch = getchar();
    while (ch != '\n'){
        len++;
        ch = getchar();
    }
    printf("Your message was %d character(s) long.\n", len);
}

 

 字符数组

字符串常量是由一对双引号括起来的字符序列。 "hello world" 

字符串常量与字符常量的是不同的量。

区别:

1. 字符常量由单引号括起来, 字符串常量由双引号括起来。

2. 字符常量只能是单个字符, 字符串常量则可以含一个或多个字符。

3. 可以把一个字符常量赋予一个字符变量, 但不能把一个字符串常量赋予一个字符变量

4. 字符常量占一个字节的内存空间。 字符串常量占的内存字节数等于字符串中字节数加1。增加的一个字节中存放字符"\0",这是字符串结束标志。记住是0, 不是o, 是01的0

char s[]="dsfdsfsdf"
char s[]={'a', 'b', 'c'};

 

转义字符

转义字符是一种特殊的字符常量。转移字符以反斜线'\'开头, 后跟一个

或几个字符。转义字符具有特定的含义, 不同于字符原有的意义, 故称“转义”字符。

例如, 在前面各例题中printf函数的格式串中用到的"\n"就是一个转义字符, 其意义是'回车换行"。转义字符

主要用来表示那些用一般字符不便于表示的控制代码。

 

强制类型转换

强制类型转换是通过类型转换运算来实现的。

其一般形式为:

(类型说明符)(表达式)

其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。

例如:

(float)a 把a转换成浮点型

(int)(x+y) 把x+y的结果转换为整型

在使用强制转换时应注意一下问题:

1)类型说明符和表达式都必须加括号(单个变量可以不加括号,)如把(int)(x+y)

写成(int)x+y则成为了x专场成int型之后再与y相加了

2)无论是强制转换或是自动转换, 都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不是改变数据说明时对该变量定义的类型

void main()
{
    char a;
    int b;
    a = '1';
    b = 22;
    printf("%f %d", (float)(b), (int)(a));
}

 

算数运算和表达式

%  得到余数  7 % 2 得到1

 

    

字符串

 

 

 

 

 

 

方法一:

定义字符串数组

#define  STR_LEN 80
    char str[STR_LEN + 1] = "abcd";
    printf("%s", str);

 

方法二:

通过字符指针的方式:

在声明指针的适合,指向字符串字面量,不可以修改字符串字面量,数组可改。
char
*a; a = "test"; printf("%s", a); /*test*/

 

字符串的非法操作

 

字符串复制 strcpy函数

原型

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

strcpy函数把s2中的字符串复制给了字符串s1,直到遇到‘\0’;

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


int main(void) {
    char *str1 = "abcd", *str2;
    strcpy(str2, str1);
    printf("%s", str2); //abcd
    return 0;
}

 

 

c语言字符串拼接 strcat

#include <stdio.h>
#include <string.h>
int main()
{
    char a[100] = "say";
    char *c = "hello";
    strcat(a, c);
    printf("%s", a);
    return 0;
}

 

为什么c语言字符串拼接不能用指针的方式呢?

为什么下面的不行呢?

strcat是没有重新申请空间的,只是直接将前面的参数的最后一个'\0'去掉,然后讲第二个参数的字符直接添上去,再在末尾补'\0',所以前面的空间至少有下str1+str2+1空间。

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


int main(void) {
    char *str1 = "hello ", *str2 = "world!!!";
    strcat(str1, str2);
    printf("%s", str1); //abcd
    return 0;
}

 

c语言字符串追加 strncat 

char * strncat(char *dest, const char *src, size_t n);

解释:

  把src所指字符串的前n个字符添加到dest所指字符串的结尾处,并覆盖dest所指字符串结尾的'\0',从而实现字符串的连接。

注意:

  拼接的时候要有足够的空间

示例:

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

int main(){

    char ch1[10] = "hello";
    char ch2[5+1] = "world";
    strncat(ch1, ch2, 3);
    printf("%s\n", ch1); //结果是:hellowor
    return 0;
}

 

c语言字符串比较 strcmp

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


int main(void) {
    char *str1 = "hello adfadf", *str2 = "world!!!";
    int i;
    i = strcmp(str1, str2);
    printf("%d", i); // -15,为啥我也不知道

    //printf("%s", str1); //abcd
    return 0;
}

 

 当str1 == str2的时候结果为0

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

int main(){
    printf("hello world!!!\n");

    char *str1 = "hello", *str2 = "hello";
    int i = strcmp(str1, str2);
    printf("%d",i);
    return 0;
}

 

当str1 > str2 的时候,正数

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

int main(){
    printf("hello world!!!\n");

    char *str1 = "hello1", *str2 = "hello";
    int i = strcmp(str1, str2);
    printf("%d",i);
    return 0;
}

 

当str1 < str2 的时候, 负数

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

int main(){
    printf("hello world!!!\n");

    char *str1 = "hello", *str2 = "hello2";
    int i = strcmp(str1, str2);
    printf("%d",i);
    return 0;
}

 

c语言字符串区间比较 strncmp,高级玩法

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

int main(){

    char a[10] = "abcdefg";
    printf("%s\n", a);
    int i;
    i = strncmp(a, "abc", 3); // 意思是从a+0的地方到a+2的地方比较
    printf("%d\n",

 

 

c语言求字符串长度 strlen函数

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


int main(void) {
    char *str1 = "hello world!!!";
    int i;
    i = strlen(str1);
    printf("%d", i); // 14
    return 0;
}

 

 

 

字符串数组的两种写法 

但是这样只适合直接创建赋值时候用;

 

 

方法一:

 

方法二:

 

 

字符串示例,比较不错的学习例子, 字符串数组的操作

 

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

#define MAX_REMIND 50
#define MSG_LEN 60

int read_line(char str[], int n);

int main() {

    char reminders[MAX_REMIND][MSG_LEN + 3]; //定义二维数组, 可以输入50个样本
    char day_str[3], msg_str[MSG_LEN + 1]; // 定义时间, 消息;
    int day, i, j, num_remind = 0;

    for (;;) {  // 无限循环
        if (num_remind == MAX_REMIND) {    // 如果达到次数,break,结束不输入了
            printf("--No space left --\n");
            break;
        }
        printf("Enter day and reminder: ");
        scanf("%2d", &day); //输入天数

        if (day == 0) //输入0结束
            break;
        sprintf(day_str, "%2d", day); //强制格式化时间为字符串;
//        printf("day_str: %s\n", day_str);
//        printf("num_remind: %d\n", num_remind);
        read_line(msg_str, MSG_LEN); //消息和字符串,字符数组;

        for (i = 0; i < num_remind; i++) {
            if (strcmp(day_str, reminders[i]) < 0) //校验,如果转换的日期和输入的不一样,结束
                break;
        }

        strcpy(reminders[i], day_str); // 复制字符串
        printf("i: %s \n", reminders[i]);
        strcat(reminders[i], msg_str); // 合并字符串
        printf("i: %s \n", reminders[i]);

        num_remind++;
    }
    printf("\nDay Reminder \n");
    for (i = 0; i < num_remind; i++) { //最后循环打印
        printf(" %s\n", reminders[i]);
    }


    return 0;
}

int read_line(char str[], int n) {
    char ch;
    int i = 0;

    while ((ch = getchar()) != '\n') {
        if (i < n)
            str[i++] = ch;
    }
    str[i] = '\0';
    return i;
}

 

 

c语言字符串替换,非常不错的例子

 是不是和python的replace很像呀

编写名为censor的函数,用来把字符串中的出现的每一处字符“foo”

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

char *strrpc(char *str, char *oldstr, char *newstr);

int main() {

    char p[] = "hello world.";
    printf("替换前:%s\n", p);
    printf("替换后:%s\n", strrpc(p, ".", "!!!"));
    return 0;
}

char *strrpc(char *str, char *oldstr, char *newstr) {
    char bstr[strlen(str)];//转换缓冲区
    memset(bstr, 0, sizeof(bstr)); //内存重置

    for (int i = 0; i < strlen(str); i++) {
        /*查找目标字符串, 因为需要从某str+i -->str + i + strlen(oldstr)区间的字符和oldstr进行比较*/
        /*如果==0,则进行拼接*/
        if (!strncmp(str + i, oldstr, strlen(oldstr))) {
            strcat(bstr, newstr);
            i += strlen(oldstr) - 1; //跳到对比字符的后面继续,这里为什么要减1呢,因为索引从0开始呀;
        } else {
            /*如果没匹配成果,则进行指定多长的字节进行拼接,这里的1是拼接一个字符*/
            strncat(bstr, str + i, 1);//这里的1是size_t n,拼接几个长度
        }
    }

    strcpy(str, bstr);
    return str;
}

============================
替换前:hello world.
替换后:hello world!!!

 

posted @ 2017-03-10 09:30  我当道士那儿些年  阅读(2644)  评论(0编辑  收藏  举报