目录一、典型问题一二、典型问题二三、典型问题三四、典型问题四一、典型问题一 下面的程序输出什么?为什么? 分析 snprintf 函数本身是可变参数函数,原型如下:int snpr
下面的程序输出什么?为什么?
分析
snprintf 函数本身是可变参数函数,原型如下:int snprintf( char* buffer, int buf_size, const char*fomart,... )
当函数只有 3 个参数时,如果第三个参数没有包含格式化信息,函数调用没有问题:相反,如果第三个参数包含了格式化信息,但缺少后续对应参数,则程序行为不确定。
下面编程看看究竟会输出什么:
#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;
}
输出结果如下:
所以程序该这么写:
#include <stdio.h>
int main()
{
char buf[10] = {0};
char src[] = "hello %s";
snprintf(buf, sizeof(buf), src, "Ze");
printf("buf = %s\n", buf);
return 0;
}
或者这样:
#include <stdio.h>
int main()
{
char buf[10] = {0};
char src[] = "hello Ze";
snprintf(buf, sizeof(buf), src);
printf("buf = %s\n", buf);
return 0;
}
均能输出正确的结果:
下面的程序输出什么?为什么?
分析
下面来编程验证:
#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));
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;
}
输出结果如下:
注意 sizeof(src) = 4,这是因为 src 为指针
下面的程序输出什么?为什么?
分析
一些现代编译器能够将相同的字符串字面量映射到同一个无名字符数组,因此 == 比较结果为 true 。
下面来编程验证:
#include <stdio.h>
#include <string.h>
int main()
{
#define S1 "D.T.Software"
#define S2 "D.T.Software"
if( S1 == S2 )
{
printf("Equal\n");
}
else
{
printf("Non Equal\n");
}
if( strcmp(S1, S2) == 0 )
{
printf("Equal\n");
}
else
{
printf("Non Equal\n");
}
return 0;
}
在 GCc 编译器中输出结果如下:
在 VS2012 编译器的输出结果也是:
字符串循环右移
void right_shift_r(const char* src, char* result, unsigned int n);
函数功能:将输入字符串 src 循环右移 n 位,result 为输出结果
要求:以效率最高的方式实现。
示例:
"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[(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;
}
输出结果如下:
到此这篇关于C语言实例问题探究字符串的应用的文章就介绍到这了,更多相关C语言 字符串内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: C语言实例问题探究字符串函数的应用
本文链接: https://lsjlt.com/news/146419.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0