C 语言字符串(译)

  C 语言的 switch 语句非常强大。然而,它不能用字符串作为判断条件,只能用常整数。这是可以理解的,因为 C 的字符串仅仅是数组,它们并不是并不是一个整体。

  在某些情况下,将 string 作为 switch 语句判断条件是非常有用的。在 lwan 中我用一个小窍门避免在热门路径调用 strcmp 家族函数。这是利用字符串仅仅是字节数组这个概念,我们将这些字节数组转化成一个指向 32 位整数的指针,并解引用这个指针。利用这个窍门,我们就可以在 switch 语句中使用短小的字符串(例如:文件扩展名,包括 . 它们大多数只有四个字符)来作为判断条件。

  C 也支持多字节整型常量。然而由于大小端的影响, 当你在这些编译这些常量时启用 -Wall -Wextra 选项,GCC 会发出警告。我的解决方法是:用宏和枚举类型配合去创建一个编译器期望的常整型。下面的代码直接从 lwan 拷贝的,为了说明  STRING_SWITCH 语句的用法:

 1 #define STRING_SWITCH_L(s) switch (*((int32_t *)(s)) | 0x20202020)
 2 #define MULTICHAR_CONSTANT(a,b,c,d) ((int32_t)((a) | (b) << 8 | (c)<< 16 | (d) << 24))
 3
 4 enum {
 5     EXT_JPG = MULTICHAR_CONSTANT_L(‘.‘,‘j‘,‘p‘,‘g‘),
 6     EXT_PNG = MULTICHAR_CONSTANT_L(‘.‘,‘p‘,‘n‘,‘g‘),
 7     EXT_HTM = MULTICHAR_CONSTANT_L(‘.‘,‘h‘,‘t‘,‘m‘),
 8     EXT_CSS = MULTICHAR_CONSTANT_L(‘.‘,‘c‘,‘s‘,‘s‘),
 9     EXT_TXT = MULTICHAR_CONSTANT_L(‘.‘,‘t‘,‘x‘,‘t‘),
10     EXT_JS  = MULTICHAR_CONSTANT_L(‘.‘,‘j‘,‘s‘,0),
11 } lwan_mime_ext_t;
12
13 const char* lwan_determine_mime_type_for_file_name(char *file_name)
14 {
15     char *last_dot = strrchr(file_name, ‘.‘);
16     if (UNLIKELY(!last_dot))
17         goto fallback;
18
19     STRING_SWITCH_L(last_dot) {
20     case EXT_CSS: return "text/css";
21     case EXT_HTM: return "text/html";
22     case EXT_JPG: return "image/jpeg";
23     case EXT_JS:  return "application/javascript";
24     case EXT_PNG: return "image/png";
25     case EXT_TXT: return "text/plain";
26     }
27
28 fallback:
29     return "application/octet-stream";
30 }

  我们注意到,STRING_SWITCH_L 是将字符串与一个 32 位整数按位或,这样做可以一次性检测 4 个字符的情况。

  这样的 switch 语句在 lwan 中用来匹配 HTTP 头和 HTTP 请求方法。也用来做简单的文件扩展名到 MIME-Type 的转换,就像上面代码所展示的那样。

  译自 http://tia.mat.br/blog/html/2012/08/09/string_switch_in_c.html ,如有错误,清留言!

时间: 2024-07-29 18:33:13

C 语言字符串(译)的相关文章

C语言字符串操作大全

转载自:C语言字符串操作总结大全(超详细) 1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, p1) 附加字符串 strncat(p, p1, n) 附加指定长度字符串 strlen(p) 取字符串长度 strcmp(p, p1) 比较字符串 strcasecmp忽略大小写比较字符串strncmp(p, p1, n) 比较指定长度字符串 strchr(p, c) 在字符串中查找指定字符 strrchr(p, c)

C语言字符串处理库函数

http://blog.csdn.net/pipisorry/article/details/36898405 使用C语言字符串处理的库函数,务必包含头文件string.h,即#include <string.h> 1. 比较字符串大小函数   1) 忽略大小写---strcasecmp 函数原型: int strcasecmp (const char *s1, const char *s2); 函数说明: 用来比较参数s1和s2字符串,比较时会自动忽略大小写的差异 2)忽略大小写-stric

C语言字符串函数大全

转载自http://www.360doc.com/content/08/0723/22/26860_1462024.shtml# 函数名: stpcpy 功能: 拷贝一个字符串到另一个 用法: char *stpcpy(char *destin, char *source); 程序例: #include<stdio.h> #include<string.h> int main(void) { char string[10]; char *str1 = "abcdefghi

C语言——字符串长度的计算方法

C语言——字符串长度的计算方法 提示:(1)计算字符串长度时关键是要注意辨认转义字符:(2)一个转义字符总是以反斜杠开始,再加一个其他字符组成.所以,遇到反斜杠时要特别注意!!! 1.不带转义字符的字符串   如:“abc!x=/”,其长度为 7   2.带转义字符的字符串   (1) 字符串“abc\n”:其中的'\n'为转义字符(换行符),计算字符串长度时只能计作一个字符,所以该字符串的长度为4(而不是5)   (2) 字符串“abc\n\\\'\"":其中有4个转义字符:'\n'

转:C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文

转自:C语言字符串操作函数 - strcpy.strcmp.strcat.反转.回文 作者:jcsu C语言字符串操作函数 1. 字符串反转 - strRev2. 字符串复制 - strcpy3. 字符串转化为整数 - atoi4. 字符串求长 - strlen5. 字符串连接 - strcat6. 字符串比较 - strcmp7. 计算字符串中的元音字符个数8. 判断一个字符串是否是回文1. 写一个函数实现字符串反转 版本1 - while版 void strRev(char *s){    

C语言 字符串和数字转换函数

atof(将字符串转换成浮点型数) 相关函数 atoi,atol,strtod,strtol,strtoul 表头文件 #include <stdlib.h> 定义函数 double atof(const char *nptr); 函数说明 atof()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回.参数nptr字符串可包含正负号.小数点或E(e)来表示指数部分,如123.456或123e-2.

C语言字符串处理函数

函数名: strcpy 功  能: 拷贝一个字符串到另一个 用  法: char *stpcpy(char *destin, char *source); 程序例: #include <stdio.h> #include <string.h> int main(void) {    char string[10];    char *str1 = "abcdefghi";    stpcpy(string, str1);    printf("%sn&

C 语言 字符串命令 strstr()的用法 实现将原字符串以分割串分割输出【转】

本文转载自;http://www.cnblogs.com/easyfrog/archive/2011/12/26/C_strstr_split_string.html C 语言 字符串命令 strstr()的用法 实现将原字符串以分割串分割输出 strstr() 命令是在原字符串中查找指定的字符串第一次出现的地址,用这个特性可以实现字符的分割,判断是否包涵等功能: 下面的这个例子是实现 字符串以分割串分割输出: 1 #include <stdio.h> 2 #include <strin

OC学习将C语言字符串转换为OC字符串

将C语言字符串转换为OC字符串 1 /** 2 * inputNSString:自定义函数 3 */ 4 #import <Foundation/Foundation.h> 5 /** 6 * 将C语言字符串转换为OC语言字符串 7 * @return OC语言字符串 8 */ 9 NSString *inputNSString(){ 10 char arr[256];//假定数组长度为256 11 char ch; 12 int length=0; 13 //while ((ch=getch