学习自狄泰软件学院唐佐林老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。
实验1 : snprintf注意
实验2 :字符串使用注意
实验3 :字符串比较
实验4 : 字符串循环右移
实验1 : snprintf注意
#include <stdio.h>
int main()
{
char buf[10] = {0};
char src[] = "hello %s";//包含了格式化信息 %s
snprintf(buf, sizeof(buf), src);
printf("buf = %s\n", buf);
return 0;
}
mhr@ubuntu:~/work/C$ ./a.out
buf = hello (nu
mhr@ubuntu:~/work/C$
改
#include <stdio.h>
int main()
{
char buf[10] = {0};
char src[] = "hello";//包含了格式化信息 %s
snprintf(buf, sizeof(buf), src);
printf("buf = %s\n", buf);
return 0;
}
mhr@ubuntu:~/work/C$ ./a.out
buf = hello
mhr@ubuntu:~/work/C$
改:
#include <stdio.h>
int main()
{
char buf[10] = {0};
char src[] = "hello %s";
snprintf(buf, sizeof(buf), src,“word!”);
printf("buf = %s\n", buf);
return 0;
}
mhr@ubuntu:~/work/C$
mhr@ubuntu:~/work/C$ gcc 31-1.c
mhr@ubuntu:~/work/C$
mhr@ubuntu:~/work/C$
mhr@ubuntu:~/work/C$ ./a.out
buf = hello ZQ
mhr@ubuntu:~/work/C$
实验2 :字符串使用注意
#include <stdio.h>
#include <string.h>
int main()
{
#define STR "Hello, \0D.T.Software\0"
char* src = STR;
char buf[255] = {0};
snprintf(buf, sizeof(buf), src);
printf("strlen(STR) = %d\n", strlen(STR));
printf("sizeof(STR) = %d\n", sizeof(STR));//字符的个数 + 编译器自加的 \0
printf("strlen(src) = %d\n", strlen(src));
printf("sizeof(src) = %d\n", sizeof(src));
printf("strlen(buf) = %d\n", strlen(buf));
printf("sizeof(buf) = %d\n", sizeof(buf));
printf("src = %s\n", src);
printf("buf = %s\n", buf);
return 0;
}
字符串是一个特殊的字符数组,字符指针可以指向一个字符数组,所以字符指针可以指向一个字符串
实验3 :字符串比较
#include <stdio.h>
#include <string.h>
int main()
{
#define S1 "D.T.Software" //字符串字面量 特殊的字符数组
#define S2 "D.T.Software" //字符串字面量 特殊的字符数组
if( S1 == S2 )// if( "D.T.Software"== "D.T.Software" ) 比较字符数组的地址
{
printf("Equal\n");
}
else
{
printf("Non Equal\n");
}
if( strcmp(S1, S2) == 0 )
{
printf("Equal\n");
}
else
{
printf("Non Equal\n");
}
return 0;
}
mhr@ubuntu:~/work/C$ gcc 31-3.c
mhr@ubuntu:~/work/C$
mhr@ubuntu:~/work/C$ ./a.out
Equal
Equal
mhr@ubuntu:~/work/C$
很不可思议,这这两个字符串字面量(字符数组)虽然内容一样,但是他们应该是存储在不同的地址,地址应该是不一样的,这里实验怎么会相同呢?? 原因是gcc编译器做的优化,正常应该是不同的。编译器认为 “D.T.Software” 这个字符串字面量已经被定义了 存储全局只读存储区,再次的定义只会浪费空间,所以编译器将S1 S2 这两个宏都指向了 同一个 字符串字面量。
#define S1 "D.T.Software" //字符串字面量 特殊的字符数组
#define S2 "D.T.Software" //字符串字面量 特殊的字符数组
实验4 : 字符串循环右移
#include <stdio.h>
#include <string.h>
void right_shift_r(const char* src, char* result, unsigned int n)
{
const unsigned int LEN = strlen(src);
int i = 0;
for(i=0; i < LEN; i++)
{
result[(n + i) % LEN] = src[i];
}
result[LEN] = '\0';
}
int main()
{
char result[255] = {0};
right_shift_r("abcde", result, 2);
printf("%s\n", result);
right_shift_r("abcde", result, 5);
printf("%s\n", result);
right_shift_r("abcde", result, 8);
printf("%s\n", result);
return 0;
}