1、典型问题一

下面的程序输出什么为什么?

 #include <stdio.h>  
  
int main()  
{  
    char buf[] = {};  
    char src[] = "hello %s";  
      
    snprintf(buf, sizeof(buf), src);   //src打印到buf里面     printf("buf = %s\n", buf);       return ;  
}  

分析 :

  snprintf函数本身是可变参数函数,原型如下:

   int snprintf(char* buffer, int buf_size, const char* fomart, ...)

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

应改为

     snprintf(buf, sizeof(buf), src, "wss");  

2、典型问题二

下面的程序输出什么为什么?

 #include <stdio.h>  
#include <string.h>  
  
int main()  
{  
    #define STR "Hello, \0D.T.Software\0"  
      
    char* src = STR;  
    char buf[] = {};  
      
    snprintf(buf, sizeof(buf), src);  
      
    printf("strlen(STR) = %d\n", strlen(STR));  //
    printf("sizeof(STR) = %d\n", sizeof(STR));  //22,即便是\0结尾也会编译器也会再加上\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);  //Hello
    printf("buf = %s\n", buf);  //Hello
      
    return ;  
}  

分析:

字符串相关的函数均以第—个出现的 '\0'作为结束符

编译器总是会在字符串字面量的未尾添加'\0'

字符串字面量的本质为数组

3、典型问题三

下面的程序输出什么为什么?

 #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) ==  )  
    {  
        printf("Equal\n");  
    }  
    else  
    {  
        printf("Non Equal\n");  
    }  
      
    return ;  

分析:

字符串之间的相等比较需要用strcmp完成

不可直接用==进行字符串直接的比较

完全相同的字符串字面量的==比较结果为false

一些现代编译器能够将相同的字符串字面量

映射到同—个无名字符数组,因此==比较

结果为true。

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 = ;  
          
    for(i=; i < LEN; i++)  //O(n)
    {  
        result[(n + i) % LEN] = src[i];  
    }  
      
    result[LEN] = '\0';  
}  
  
int main()  
{  
    char result[] = {};  
      
    right_shift_r("abcde", result, );  
      
    printf("%s\n", result);  
      
    right_shift_r("abcde", result, );  
      
    printf("%s\n", result);  
      
    right_shift_r("abcde", result, );  
      
    printf("%s\n", result);  
      
    return ;  
}  

C语言-字符串典型问题分析的更多相关文章

  1. R语言︱词典型情感分析文本操作技巧汇总(打标签、词典与数据匹配等)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:情感分析中对文本处理的数据的小技巧要 ...

  2. C语言字符串操作总结大全(超详细)

    本篇文章是对C语言字符串操作进行了详细的总结分析,需要的朋友参考下 1)字符串操作  strcpy(p, p1) 复制字符串  strncpy(p, p1, n) 复制指定长度字符串  strcat( ...

  3. C.【转】C语言字符串与数字相互转换

    1.gcvt 把浮点数转成字符串 - CSDN博客.html(https://blog.csdn.net/dxuehui/article/details/52791412) 1.1. 函数名: gcv ...

  4. C语言字符串

    C语言字符串 一.字符串基础 注意:字符串一定以\0结尾. Printf(“yang\n”); 其中yang为字符串常量,“yang”=‘y’+‘a’+‘n’+‘g’+‘\0’.字符串由很多的字符组成 ...

  5. 零基础学习C语言字符串操作总结大全

    本篇文章是对C语言字符串操作进行了详细的总结分析,需要的朋友参考下 1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, ...

  6. C语言字符串拷贝

    C语言字符串拷贝利用指针操作,要清楚知道指针的指向 代码如下: #include <stdio.h> #include <assert.h> #include <stri ...

  7. Redis学习——SDS字符串源码分析

    0. 前言 这里对Redis底层字符串的实现分析,但是看完其实现还没有完整的一个概念,即不太清楚作者为什么要这样子设计,只能窥知一点,需要看完redis如何使用再回头来体会,有不足之处还望告知. 涉及 ...

  8. C语言字符串长度(转)

    C语言字符串长度的计算是编程时常用到的,也是求职时必考的一项. C语言本身不限制字符串的长度,因而程序必须扫描完整个字符串后才能确定字符串的长度. 在程序里,一般会用strlen()函数或sizeof ...

  9. C语言字符串操作常用库函数

    C语言字符串操作常用库函数 *********************************************************************************** 函数 ...

随机推荐

  1. jquery ajax简单书写

    占时无法显示该内容,请稍后再试 $.ajax({ url:"http://v.juhe.cn/weather/index", data:{cityname:"苏州&quo ...

  2. Wannafly Winter Camp 2020 Day 6C 酒馆战棋 - 贪心

    你方有 \(n\) 个人,攻击力和血量都是 \(1\).对方有 \(a\) 个普通人, \(b\) 个只有盾的,\(c\) 个只有嘲讽的,\(d\) 个有盾又有嘲讽的,他们的攻击力和血量都是无穷大.有 ...

  3. MySQL char与varchar 的区别

    一.差异 1.占用存储空间上 char 初始化时占固定空间,varchar依据插入内容大小使用空间. 2.char最大字符长度255个(约0.1KB),varchar则是65535(约192KB). ...

  4. webdriver中的定位\模拟\及实例

    Selenium webdriver 下载 pip install selenium pip install -i https://pypi.doubanio.com/simple/ selenium ...

  5. 一起学Vue之表单输入绑定

    在Vue进行前端开发中,表单的输入是基础且常见的功能,本文以一个简单的小例子,简述v-model数据绑定的用法,仅供学习分享使用,如有不足,还请指正. 基础用法 你可以用 v-model 指令在表单 ...

  6. 题解【AcWing1089】烽火传递

    题面 单调队列优化 DP 模板题. 我们考虑设 \(dp_{i}\) 表示从 \(1\) 到 \(i\) 能够准确传递情报,且第 \(i\) 个烽火台发出信号的最小费用. 转移方程不难得出:\(dp_ ...

  7. Oracle Solaris 10 重启后提示 Bad PBR sig

    Solaris 10 安装完毕重启后提示 Bad PBR sig 在磁盘分区的时候,默认自带的 overlap 不要删除,否则启动报错. 分区时,保留overlap(默认显示总容量大小)分区.安装操作 ...

  8. 回味Ubuntu10.10致敬Gnome桌面

    目录 Ubuntu10.10可用源 Ubuntu10.10更新语言包 输入法支持 浏览器选择 文件下载 压缩文件中文乱码的处理 视频播放 科学计算 搭建Lamp环境 实现文件分享 主题美化 Ubunt ...

  9. threadpool 实例介绍第二篇

  10. react-native构建基本页面5---调用拍照摄像头

    调用摄像头拍照 react-native-image-picker的github官网 yarn add react-native-image-picker 运行react-native link自动注 ...