随笔-2015-9-7

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中的中文乱码

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yiluohan0307

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值