字符串(2)

转义字符

转义字符串(Escape Sequence)也称字符实体(Character Entity)。
转义无非是两种情况:1:将普通字符转为特殊用途,一般是编程语言中,用于表示不能直接显示的字符,比如后退键,回车键,等。2:用来将特殊意义的字符转换回它原来的意义。一般用在正则表达式中。

转义字符表

转义字符意义ASCII码值(十进制)
\a响铃(BEL)007
\b退格(BS) ,将当前位置移到前一列008
\f换页(FF),将当前位置移到下页开头012
\n换行(LF) ,将当前位置移到下一行开头010
\r回车(CR) ,将当前位置移到本行开头013
\t水平制表(HT) (跳到下一个TAB位置)009
\v垂直制表(VT)011
\代表一个反斜线字符”\’092
\’代表一个单引号(撇号)字符039
\”代表一个双引号字符034
\?代表一个问号063
\0空字符(NULL)000
\ooo1到3位八进制数所代表的任意字符三位八进制
\xhh1到2位十六进制所代表的任意字符二位十六进制
\0空字符,特例转义字符,表示取值为0的字符不计算在字符个数中

很长的常量字符串表示方法

char letter[] = {"abcedfghijklm\
nopqrstuvwxyz"};
char letter[] = {"abcdefghijklm""nopqrstuvwxyz"};

\两种行续接方法。

二分查找算法


目标:在一个包含n个元素的数组M中查找元素x。
该算法假定数组M按照递增顺序存储。
步骤一: 设定low为0,high为n-1。
步骤二: 若low>high,则x不在M中,算法终止。
步骤三: 设定mid=(low+high)/2。
步骤四: 若M[mid] < x,设定low为mid+1,返回步骤二。
步骤五: 若M[mid] > x,设定high为mid-1,返回步骤二。
步骤六: 若M[mid ]= x,算法结束。


字符操作

一般字符串都有其对应的ASCⅡ码作为对应整型数值,所以字符的比较实际上为字符所对应的ASCⅡ码数值的比较。
通过该方式的原理可以写一个字符串转换为对应的整数的程序。

经典程序

用二分查找算法设计一个词典查找程序

#include<stdio.h>
/*定义一个全局变量结构体,用于保存单词及其定义*/
struct entry
{
    char word[15];
    char definition[50];
};

/*此函数比较两个字符串*/
int compareString(const char w1[], const char w2[])
{
    int i = 0, answer;
    while (w1[i] == w2[i] && w1[i] != '\0' && w2[i] != '\0')
        i++;
    if (w1[i] < w2[i])
        answer = -1;    /* w1 < w2 */
    else if (w1[i] > w2[i])
        answer = 1;     /* w1 > w2 */
    else
        answer = 0;     /* w1 = w2 */

    return answer;
}

/*此函数用二分查找算法在词典中查找某个单词*/
int lookup(const struct entry dictionary[], const char search[], const int entries)
{
    int low = 0;
    int high = entries - 1;
    int mid, result;
    int compareString(const char w1[], const char w2[]);

    while (low <= high)
    {
        mid = low + high / 2;
        result = compareString(dictionary[mid].word, search);
        if (result == -1)
            low = mid + 1;
        else if (result == 1)
            high = mid - 1;
        else
            return mid;           /*找到单词*/
    }
    return -1;                    /*没找到单词*/
}

/*词典主程序  entry:条目*/
int main(void)
{
    const struct entry dictionory[100] =
    { {"apple","苹果"},{"banana","香蕉"},{"orange","橘子"},{"starwberry","草莓"}
    };
    int entries = 4;
    char word[15];
    int entry;
    int lookup(const struct entry dictionary[], const char search[], const int entries);
    printf("Enter Word: ");
    scanf_s("%14s", &word,14);

    entry = lookup(dictionory, word, entries);
    if (entry != -1)
        printf("%s\n", dictionory[entry].definition);
    else
    {
        printf("Sorry,the word %s is not in this dictionary.\n", word);
    }
    system("pause");
    return 0;
}

PS

scanf与scanf_s函数的区别

char buffer[128];
scanf("%127s", buffer); // 安全
scanf_s("%127s", buffer, 128); // 安全
scanf("%s", buffer); // 不安全
scanf_s("%s", buffer, 128); // 安全,当输入过长时能调用报错函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值