C语言字符串典型问题

例程 1

#include <stdio.h>
int main()
{
  char buf[10] = {0};
  char src[] = "hello %s";
  /*
    snprintf(),函数原型为int snprintf(char *str, size_t size, const char *format, ...)
    将可变参数 “…” 按照format的格式格式化为字符串,然后再将其拷贝至str中。
  */
  snprintf(buf,sizeof(buf),src);
  printf("buf = %s\n",buf);
  return 0;
}

执行结果:

例程1分析:

snprintf只有3个参数时,如果第3个参数没有包含格式化信息,函数调用没问题;相反如果第3个参数有格式化信息,但缺少后续对应参数,则程序行为不确定。

 

例程 2

#include <stdio.h>
#include <string.h>

int main()
{
    #define STR "hello, \0 C is beaultiful\0"//这里面一共25个字符
    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("sizeof(char*) = %d\n",sizeof(char*));

    printf("src = %s\n",src);
    printf("buf = %s\n",buf);
    return 0;
}

执行结果:

例程2分析:

所有字符串操作函数都是以字符串中第一个'\0'做为停止的标志,所以第1、3 、5条打印的是7

第2条打印26是因为宏定义的字符串被编译器视为字符串常量,并且会自动在末尾加上'\0'

第4条打印8是因为src为char*类型,是指针类型,指针的长度与编译器和机器字长都有关系,我本机是MinGW64位的gcc编译器  机器字长64位  所以打印出来的长度为8  这个在后续的             sizeof(char*)有验证

第6条打印255是因为buf的类型是char[255]  所以占用的长度为1*255 等于255

最后2条则是验证了字符串拷贝函数是以第一个'\0'做为停止标志

例程 3

#include <stdio.h>
#include <string.h>

int main()
{
    #define S1 "hello"
    #define S2 "hello"

    if (S1 == S2)
    {
        printf("equal\n");
    }
    else
    {
        printf("no equal\n");
    }

    if (strcmp(S1,S2) == 0)
    {
        printf("equal\n");
    }
    else
    {
        printf("no equal\n");
    }
    return 0;
}

GCC编译器执行结果:

例程3分析:

这说明GCC编译器会对宏定义做优化,而对于有些编译器,不会做优化,则第一条比较输入的结果位”no equal“

 

例程 4

#include <stdio.h>
#include <string.h>

void right_shift_nbit(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()
{
    //字符串循环右移   
    //例如:“abcde”  循环右移动2位得到 “deabc”
    //要求以最高效的方式实现
    char result[20] = {0};
    right_shift_nbit("abcde",result,2);
    printf("%s\r\n",result);

    memset(result,0,sizeof(result));
    right_shift_nbit("abcde",result,5);
    printf("%s\r\n",result);

    memset(result,0,sizeof(result));
    right_shift_nbit("abcde",result,8);
    printf("%s\r\n",result);
    

    return 0;
}

执行结果:

例程4分析

当一个字符串长5个字节时,我们循环右移5位,这时相当于没有右移;当我们移动2位时,第0位变为第2位,第5位变为第1位;于是可以发现一个规律,移动后的脚标 = (移动前的脚标+移动位数)% 字符串长度

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rookie Linux

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值