關鍵詞:snprintf
吨拍、strcmp
1. 下面的程序輸出什么防症? 為什么蜗搔?
#include <stdio.h>
#include <string.h>
int main()
{
char buf[10] = {0};
char src[] = "hello %s";
snprintf(buf, sizeof(buf), src);
printf("buf = %s\n", buf);
return 0;
}
輸出結果:
@jacob:~/c_code/c/31$ gcc 1.c
1.c: In function ‘main’:
1.c:17:2: warning: format not a string literal and no format arguments [-Wformat-security]
snprintf(buf, sizeof(buf), src);
^
1.c:17:2: warning: format not a string literal and no format arguments [-Wformat-security]
@jacob:~/c_code/c/31$ ./a.out
buf = hello ???
總結:
snprintf函數(shù)本身是可變參數(shù)函數(shù),原型如下:
int snprintf(char* buffer, int buf_size, const char* fomart, ... )
// 當函數(shù)只有3個參數(shù)時畦贸,如果第三個參數(shù)沒有包含格式化信息,函數(shù)調(diào)用沒有問題楞捂;
//如果第三個參數(shù)包含了格式化信息薄坏,但缺少后續(xù)對應參數(shù),則程序行為不確定寨闹。
格式化信息必須與變參個數(shù)相匹配胶坠。
上面代碼修改如下:
#include <stdio.h>
#include <string.h>
int main()
{
char buf[10] = {0};
char src[] = "hello %s";
snprintf(buf, sizeof(buf), src, "w");
printf("buf = %s\n", buf);
return 0;
}
輸出結果:
buf = hello w
2. 下面的程序輸出結果是什么?為什么繁堡?
#include <stdio.h>
#include <string.h>
#define STR "Hello, \0D.T.Software\0"
int main()
{
char* src = STR;
char buf[255] = {0};
snprintf(buf, sizeof(buf), src);
printf("strlen(STR) = %d\n", strlen(STR)); // 7
printf("sizeof(STR) = %d\n", sizeof(STR)); // 22
printf("strlen(src) = %d\n", strlen(src)); // 7
printf("sizeof(src) = %d\n", sizeof(src)); // 4
printf("strlen(buf) = %d\n", strlen(buf)); // 7
printf("sizeof(buf) = %d\n", sizeof(buf)); // 255
printf("src = %s\n", src); // hello,
printf("bur = %s\n", buf); // hello,
return 0;
}
輸出結果:
strlen(STR) = 7
sizeof(STR) = 22
strlen(src) = 7
sizeof(src) = 4
strlen(buf) = 7
sizeof(buf) = 255
src = Hello,
bur = Hello,
總結:
(1) 字符串相關的函數(shù)均以第一個出現(xiàn)的'\0'作為結束符沈善;
(2)編譯器總是會在字符串字面量的末尾添加'\0';
(3) 字符串字面量的本質(zhì)為字符數(shù)組椭蹄。
注意區(qū)分:
(1) 字符串
(2) 字符數(shù)組
(3) 字符指針
3. 下面程序輸出什么闻牡?為什么?
#include <stdio.h>
#include <string.h>
#define S1 "D.TSoftware"
#define S2 "D.TSoftware"
int main()
{
if( S1 == S2 )
{
printf("Equal\n");
}
else
{
printf("Non Equal\n");
}
if( 0 == strcmp(S1, S2) )
{
printf("Equal\n");
}
else
{
printf("Non Equal\n");
}
return 0;
}
在gcc編譯器下輸出結果:
Equal
Equal
在bcc編譯器下輸出結果:
Non Equal
Equal
分析:
在gcc編譯器下绳矩,定義S2時發(fā)現(xiàn)字符串字面量在只讀存儲區(qū)里面有了罩润,就不需要定義一份一模一樣的字符串字面量,編譯器在編譯的時候將S1和S2都指向同一個字符串字面量翼馆,這里的S1和S2所代表的只讀存儲區(qū)里的字符數(shù)組是同一個割以,因此金度,它們的結果是相等的。
總結:
(1) 字符串之間的相等比較需要用strcmp完成严沥,不可直接用 == 進行字符串直接比較猜极;
(2) 完全相同的字符串字面量的 == 比較結果往往為false,一些現(xiàn)代編譯器能夠將相同的字符串字面量映射到同一個無名字符數(shù)組消玄,因此 == 比較結果為 true历极。
注意:不編寫依賴特殊編譯器的代碼,因此字符串之間的相等比較用strcmp窗宦。
4. 字符串循環(huán)右移
void right_shift_r(const char* src, char* result, unsigned int n);
// 函數(shù)功能: 將輸入字符串src循環(huán)右移n位勤庐, result為輸出結果。
// 要求: 以效率最高的方式實現(xiàn)奥溺。
// 實例:
// "abcde" -- 2 --> "deabc"
// "abcde" -- 8 --> "cdeab"
代碼如下:
#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[(i+n) % 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;
}
輸出結果:
deabc
abcde
cdeab
聲明:此文章為本人在學習狄泰軟件學院《C語言深度解析》所做的筆記辞色,文章中包含狄泰軟件資料內(nèi)容一切版權歸狄泰軟件所有!