去除字符串的开头和结尾的空格,内部若有连续空格之保留一个。
#include <stdio.h>
#include <string.h>
void TrimBlank(char * s)
{
if(NULL == s)
{
return ;
}
int iLen = strlen(s);
if(iLen <= 0)
{
return ;
}
//trim left
int i = 0;
for (i = 0; i < iLen; i++)
{
if(s[i] != ' ')
{
break;
}
}
if(i == iLen) //this means string is all blank
{
return ;
}
//trim right
char * pcRight = &s[iLen - 1];
while (*pcRight == ' ')
{
pcRight--;
}
*(pcRight+1) = '\0';
//trim middle duplicate blank
bool bInSpace = false;
int iNewIndex = 0;
char *pcStart = &s[i];
iLen = strlen(pcStart);
for (i = 0; i < iLen; i++)
{
if(pcStart[i] == ' ')
{
if(bInSpace)
{
continue;
}
else
{
s[iNewIndex++] = pcStart[i];
}
bInSpace = true;
}
else
{
s[iNewIndex++] = pcStart[i];
bInSpace = false;
}
}
s[iNewIndex] = '\0';
}
int main()
{
char ac[] = " This is a happy day , only ll ";
TrimBlank(ac);
printf("%s\n", ac);
return 0;
}
常用的字符函数
isalnum() 字母或数字
isalpha() 字母
isblank() 空白字符
isspace() 空白字符
isdigit() 数字
islower() 小写字母
isupper() 大写字母
isprint() 可打印字符
isgraph() 除空格之外的所有可打印字符
ispunct() 标点符号
tolower()
toupper()
一个 if/else 的 bug
if(number > 6)
if(number < 12)
printf("You're close!\n");
else
printf("Sorry, you lose a turn\n");
这个else是和 if(number < 12)配对的。
else和它最近的一个if相匹配。
TIPS:只要所有的if和else都加上括号,就永远不会有这种bug。
判素数
bool bIsPrimer(int num)
{
int div = 2;
bool isPrime = true;
for ( ; (div*div) <= num; div++)
{
if(num % div == 0)
{
isPrime = false;
break;
}
}
return isPrime;
}
&& 的优先级高于 ||
a > b && b > c || b > d
等价于 ((a>b) && (b>c)) || (b>d)
C语言保证逻辑表达式是从左到右求值的。 && 和 || 运算符是序列的分界点。 因此在程序从一个操作数前进到下一个操作数之前,所有的副作用都会生效。
while ((c = getchar()) != ' ' && c != '\n')
while (x++ < 10 && x+y < 20)
&&运算符是序列的分界点。保证了在对右边表达式求值之前,先把x的值增加1.
switch 的判断表达式应具有整数值(包括char类型)。
case 标签必须是 整形常量 或 整数常量表达式。
case 标签不能使用变量。
scanf 返回成功读入的项目的个数。
浮点数比较大小:
两个浮点数相减的绝对值比精度小,就可以认为相等。
if( fabs(float1 - float2) <= 0.000001 ) {
printf("float1 and float2 is close enough!\n");
}
所有非零值被认为是真,只有零被认为是假。
几个常见的运算符的优先级
() 左-->右
- + ++ -- sizeof (type) 左<--右
* / % 左-->右
+ - 左-->右
< > <= >= 左-->右
== != 左-->右
= 左<--右
for ( ; ; ) 中间的控制表达式为空被认为是真。
x *= 3*y + 12
等价于
x = x * (3*y + 12)
逗号运算符
两个属性:
它保证被它分开的表达式按从左到右的次序进行计算。即逗号是个顺序点,逗号左边产生的所有副作用都在程序运行到 右边之前生效。
整个逗号表达式的值是右边成员的值。
例子:
x = (y = 3, (z = ++y + 2) + 5);
x = 11
y = (249, 500);
y = 500
y = 249, 500;
y = 249
因为逗号的优先级比等号更低。
g++ -S main.cpp
g++ -g -c main.cpp
objdump -S main.o > mainObjdump.s
g++ -c -g -Wa,-adlhn main.cpp > main.s
#include <stdio.h>
int main()
{
int i;
printf("hello world!\n");
//i++;
/*
30 .loc 1 9 0
31 0021 8345F401 addl $1, -12(%ebp)
*/
//++i;
/*
30 .loc 1 8 0
31 0021 8345F401 addl $1, -12(%ebp)
*/
//i = 0;
/*
30 .loc 1 8 0
31 0021 C745F400 movl $0, -12(%ebp)
31 000000
* /
//i = i + 1;
/*
32 .loc 1 8 0
33 0028 8345F401 addl $1, -12(%ebp)
*/
return 0;
}
输入 “I am a student”
输出 “student a am I”
思路:
先把每个单词的翻转,然后再将整个字符串翻转。
即: “I am a student” –> “I ma a tneduts” –> “student a am I”
#include <stdio.h>
#include <string.h>
void ReverseString(char * s, int from, int to)
{
while (from < to)
{
char t = s[from];
s[from++] = s[to];
s[to--] = t;
}
}
void WordReverse(char * pcSentence)
{
int iStart = 0;
int iEnd = 0;
while (1)
{
if(pcSentence[iEnd] == '\0')
{
if(iStart != iEnd)
{
ReverseString(pcSentence, iStart, iEnd - 1);
}
break;
}
else if(pcSentence[iEnd] == ' ')
{
ReverseString(pcSentence, iStart, iEnd - 1);
iStart = iEnd + 1;
iEnd = iStart;
}
else
{
iEnd++;
}
}
ReverseString(pcSentence, 0, strlen(pcSentence) - 1);
}
int main()
{
char ac[] = " I am a student.";
WordReverse(ac);
printf("ac = %s\n", ac);
return 0;
}
«编程之法» 学习
给定一个字符串,要求将字符串的前面若干个字符移动到字符串的尾部。例如:
将字符串”abcdef”的前面3个字符移动到尾部,那么原字符串变成”defabc”。
#include <stdio.h>
#include <string.h>
void Reverse(char * pcStart, char * pcEnd)
{
if(NULL == pcStart || NULL == pcEnd)
{
return ;
}
while (pcStart < pcEnd)
{
char c = *pcStart;
*pcStart = *pcEnd;
*pcEnd = c;
pcStart++;
pcEnd--;
}
}
void LeftRotate(char * pcStr, int iNum)
{
if(NULL == pcStr || iNum <= 0)
{
return;
}
int iStrLen = strlen(pcStr);
iNum = iNum % iStrLen;
Reverse(pcStr, pcStr + iNum - 1);
Reverse(pcStr + iNum, pcStr + iStrLen - 1);
Reverse(pcStr, pcStr + iStrLen - 1);
}
void vTest(const char * pcCaseName, char * pcStr, int iNum, const char * pcExpectResult)
{
LeftRotate(pcStr, iNum);
if(strcmp(pcExpectResult, pcStr) == 0)
{
printf("%s: pass\n", pcCaseName);
}
else
{
printf("%s: failed\n", pcCaseName);
}
}
void vTest1()
{
char ac[] = "abcdefghi";
vTest("vTest1", ac, 3, "defghiabc");
}
void vTest2()
{
char ac[] = "abcdefghi";
vTest("vTest2", ac, 10, "bcdefghia");
}
int main()
{
vTest1();
vTest2();
return 0;
}