您的位置:首页 > 其它

字符串处理-研发积累细节

2013-05-24 09:55 274 查看
最好看源码:sizeof--strlen--memset--rename--strcat--strcpy

==============================================

1:sizeof/strlen: 你猜是几?

#include <stdio.h>

#include <string.h>

#define TTT(t) \

printf("%s ",t );printf("strlen:%d, sizeof: %d\n",strlen(t), sizeof(t));

int main()

{

char *t="abcdef";

char *t2="abcdef\nabcdef";

char t3[]="abcdef";

char t4[]="abcd\0def";

char t5[10000];

TTT(t);

TTT(t2);

TTT(t3);

TTT(t4);

TTT("abc");

TTT(t5);

}

#64位系统上 你猜是几?

#include <stdio.h>

typedef union{

char c;

long i;

int k[5];

}Data;

int main()

{

printf("%d i:%d k:%d \n", sizeof(Data),sizeof(long),sizeof(char));

}

=================================================

2:strcat 你猜会出现什么状况

#include <stdio.h>

#include <string.h>

int main()

{

char str[10] = "11111111 ";

char str1[100] = "222222222222 ";

strcat(str,str1);

printf ("%s\n", str);

}

==================================================

3:rename:你猜是copy还是mv

#include <stdio.h>

//rename == mv 1/yy 2/lyy1122

int main()

{

if(rename("1/yy", "2/lyy1122") == 0){

printf ("ok\n");

}

else

perror ("error");

}

==================================================

4:strcpy或格式化输出:你猜memset有没有作用

#include <stdio.h>

#include <string.h>

//测试strcpy或者sprintf不用memset行不行

int main()

{

int i = 888;

char str[100] = "************************";

// sprintf(str,"111111%d",i); //有没有可能输出111111********

strcpy(str,"1111"); //这个呢??

i = 0;

while(str[i] != '\0'){

printf("%c",str[i]);

i++;

}

printf("\n%s\n",str);

}

//用memcpy,memset才有意义

===================================================

5:你猜是strcpy 连着\n\r一起拷贝么??遇换行结束还是遇\0结束??

在研发中读行时候遇到了这个问题,导致后面被接上了一行syslog打印出来的log。还以为是地址空间分配溢出造成的

结果败在这儿!!!

#include <stdio.h>

#include <stdlib.h>

int main()

{

FILE *fp = fopen("test.txt", "r");

if(fp == NULL){

perror("fopen failed!"); return -1;

}

while(!feof(fp) && strcmp(line, "\n") != 0){

fgets(line, sizeof(line), fp);

if(strncasecmp(line, "lyy-test", sizeof("lyy-test")) == 0){

strcpy(test, line); //这一行容易出错 读文件的时候按行读连\n一起

syslog(LOG_INFO, test); //如果这时候调用syslog 会对换行符有特定的处理,这时候应该注意test中的换行符处理。

}

}

===================================================

6:sprintf:如果格式化输出NULL 你猜会怎样??

#include <stdio.h>

#include <string.h>

int main()

{

char *pstr = NULL;

char str[100] = {0};

char des[200]= {0};

sprintf(desc, "str:%s pstr:%s", str, pstr);

puts(desc);

}

=====================================================

关于msgrcv的接受字符串:在程序里有一段这样的代码:

strcpy(msg_w.username," job end");

msgsnd(writeid, &msg_w, len, 0); //发送

..............................................................

strcpy(msg_r.username, "yingying.liu@cs2c.com.cn")

msgrcv(readid, &msg_r, sizeof(Msg_S), (long)ptid, 0);

printf("username:%s\n", msg_r.username);

你猜猜是什么结果? 是job end 还是job
endg.liu@cs2c.com.cn?加上memset()或者strstr(msg_r, "job end"){pthread_exit()}之后呢?

今天遇到了这个问题以至于线程没有结束点一直在阻塞了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: