1.判断用户是否为root
#!/bin/bash
#am-i-root.sh
ROOT_UID=0
if [ "$UID" -eq "$ROOT_UID" ]
then
echo "You are root."
else
echo "You are just an ordinary user (but mom loves you as the same)."
fi
exit 0
#==========================================
#another way to judge if you are the root
#ROOTUSER_NAME=root
#username=`id -nu` #or username=`whoami`
#if [ "$username"="$ROOTUSER_NAME" ]
#then
# echo "Rooty,toot,toot.You are root."
#else
# echo "You are just a regular fella."
#fi
Linux支持多国语系的,屏幕会以该支持的语系来输出的。
我们的终端默认无法支持中文编码,此时将支持语系改为英文即可。
echo $LANG
LANG=en_US
c语言标准输入输出
1. 标准输入stdin
标准输出stdout
2.对于printf(print format)
转义字符:
换行 \n
退格 \b
回到行首\r
缩进 \t
printf("%[flag][width][.prec][F|N|h|l]type",变量名);
d,i 有符号十进制
u 无符号十进制
o 无符号八进制
x,X无符号十六进制
f 浮点类型
e,E科学计数法
g,G最精度
l,L双精度
c单个字符
s字符串
%%输出%
正负强加显示
printf("%+d",97);->+97
补全前缀
printf("%o",12);->14
printf("%#o",12);->014
printf("%#x",12);->0xc
printf("%#X",12);->0XC
补齐方式
默认右对齐
左对齐:-
输出宽度
printf("%5d",12)->___12
printf("%-5d",12)->12___
printf("%ld",12)->12
动态指定宽度:*.*
不足0对齐,左对齐
超过正常显示
printf("%*d",5,12)->___12
printf("%0*d",5,-12)->-00012
指定0对齐:0n
不足0对齐:左对齐
超过正常显示
printf("%05d",12)->00012
printf("%-5d",-12)->-00012
输出精度
无小数:.0
舍弃小数部分:.*
printf("%0*,*e\n",12,5,97.1)->009.7100e+01
strcpy的实现
大家一般认为名不见经传strcpy函数实现不是很难,流行的strcpy函数写法是:
char *my_strcpy(char *dst,const char *src)
{
assert(dst != NULL);
assert(src != NULL);
char *ret = dst;
while((* dst++ = * src++) != '\0')
;
return ret;
}
如果注意到:
1,检查指针有效性;
2,返回目的指针des;
3,源字符串的末尾 '\0' 需要拷贝。
写出上面实现函数就不在话下。
然而这样的实现没有考虑拷贝时内存重叠的情况,下面的测试用例就能使调用my_strcp函数的程序崩溃:
char str[10]="abc";
my_strcpy(str+1,str);
然而调用系统的strcpy函数程序正常运行,打印str结果为“aabc”!可见系统strcpy函数的实现不是这样的。
strcpy的正确实现应为:
char *my_strcpy(char *dst,const char *src)
{
assert(dst != NULL);
assert(src != NULL);
char *ret = dst;
memcpy(dst,src,strlen(src)+1);
return ret;
}
memcpy函数实现时考虑到了内存重叠的情况,可以完成指定大小的内存拷贝,它的实现方式建议查看文章“卓越的教练是如何训练高手的?”,会获益良多,这里仅粘帖函数memcpy函数的实现:
void * my_memcpy(void *dst,const void *src,unsigned int count)
{
assert(dst);
assert(src);
void * ret = dst;
if (dst <= src || (char *)dst >= ((char *)src + count))//源地址和目的地址不重叠,低字节向高字节拷贝
{
while(count--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
}
else //源地址和目的地址重叠,高字节向低字节拷贝
{
dst = (char *)dst + count - 1;
src = (char *)src + count - 1;
while(count--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst - 1;
src = (char *)src - 1;
}
}
return ret;
}
两者结合才是strcpy函数的真正实现吧。
strcat的实现
#include <stdio.h>
char *strcat(char *str1, char *str2)
{
if((str1==NULL)||(str2==NULL)) throw "Invalide arguments!";
char *pt = str1;
while(*str1!='\0') str1++;
while(*str2!='\0') *str1++ = *str2++;
*str1 = '\0';
return pt;
}
void main()
{
char a[]= "markyuan";
char b[]= "yyyyy";
char *cat = strcat(a,b);
printf("%s\n",cat);
}
eval()函数十分强大,官方demo解释为:将字符串str当成有效的表达式来求值并返回计算结果。
memset
#include <string.h>
void *memset( void *buffer, int ch, size_t count );
功能: 函数拷贝ch 到buffer 从头开始的count 个字符里, 并返回buffer指针。 memset() 可以应用在将一段内存初始化为某个值。例如:
memset( the_array, '\0', sizeof(the_array) );
这是将一个数组的所以分量设置成零的很便捷的方法。
sprintf
语法:#include <stdio.h>
int sprintf( char *buffer, const char *format, ... );
sprintf()函数和printf()类似, 只是把输出发送到buffer(缓冲区)中.返回值是写入的字符数量. 例如:
char string[50];
int file_number = 0;
sprintf( string, "file.%d", file_number );
file_number++;
output_file = fopen( string, "w" );
strchr
语法:
#include <string.h>
char *strchr( const char *str, int ch );
功能:函数返回一个指向str 中ch 首次出现的位置,当没有在str 中找ch到返回NULL。