字符串处理-研发积累细节
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()}之后呢?
今天遇到了这个问题以至于线程没有结束点一直在阻塞了。
==============================================
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()}之后呢?
今天遇到了这个问题以至于线程没有结束点一直在阻塞了。
相关文章推荐
- Java 字符串处理的一些小细节
- c/c++中动态内存分配处理字符串的细节问题
- Java 字符串处理的一些小细节
- 算法细节系列(14):动态规划之字符串处理
- 常忘了的字符串处理函数的细节问题
- C++中cin和cout中不会被注意的细节(字符串的处理)
- CodeForces 1B Spreadsheets (字符串处理,注意细节,大胆尝试)
- C#字符串处理积累(一)
- 字符串处理strlen函数需要注意的一些小细节问题
- 处理Camel Case字符串的切分——Desktop Search 开发笔记【经验积累】
- [积累]C++复习 海大2014硕士生面试题字符串处理
- 南阳oj 400 I'll play a trick on you (细节规律题 简单的字符串处理)
- 细节的积累 ---字符串的常用方法总结
- 细节的积累 ---字符串的常用方法总结
- python知识积累(三)字符串处理
- Java 字符串处理的一些小细节
- HDU-1228-A+B(字符串处理)
- 鸡啄米:C++编程入门系列之三十三(数组、指针和字符串:用字符数组存放和处理字符串)
- C和指针 第一章 字符串处理程序
- 字符串处理函数中的内存处理函数