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. Vmvare扩展虚拟机磁盘大小

    Vmvare设置好虚拟机的磁盘大小之后,发现磁盘空间不够了,这个时候怎么扩展磁盘的大小呢? 首先,在确保虚拟机关闭的情况下,右键设置,选择硬盘,扩展,这样就可以增加磁盘的大小. 但是由于未进行分区和磁 ...

  2. SQLserver 行变列。

    首先看看效果是不是想要的 变成 ok,我的效果达到了.那就记录下代码吧. create table temp1(count_ int,memo nvarchar(40))go insert into ...

  3. pycharm-1

    Python 1.4解释器(运行文件) 1.5注释:#单行,ctrl+/ 多行注释       ””” ””” 2.1变量 assert,except:lambda; nonlocal; 2.2数据类 ...

  4. 2018 IEEE极限编程大赛 题解

    去年742,今年72,也算一种小小的进步. 明年前30(笑 1. Drawing Rooted Binary Trees 给定一个树的中序和前序的遍历,要求输出这棵树(包括空格的) #include ...

  5. Uva10820 欧拉公式模板(求小于n且与n互素的数的个数)

    题意: 给出n,算出小于等于n的所有数中,有几对互质: 解法: 本质就是求有多少个2元组(x,y)满足:1 <= x,y <= n,且x与y互素. 除了(1,1)之外,其他所有的x和y都不 ...

  6. 【学习笔记】:一天搞定HTML

    PS:许多控制样式的标签在HTML5中都不推荐使用,建议使用CSS,如align,border等. 一.概念 HTML的英文全称:Hypertext Marked Language 超文本标记语言. ...

  7. Pikachu-RCE(远程命令/代码执行漏洞)

    RCE(remote command/code execute)概述 RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统. 远程系统命令执行一般出现这种漏洞,是因为 ...

  8. Java连载75-StringBuffer和StringBuilder

    一.StringBuffer和StringBuilder 1.StringBuffer是什么? 答:是一个字符串缓冲区,工作原理:预先在内存中申请一块空间以容纳字符序列,如果预留的空间,则进行自动扩容 ...

  9. Android数据存储之SD卡文件操作

    赶上智能手机刚问世时有幸用过的小伙伴都知道,那时候的Android系统是把我们自己买的SD卡作为外部存储的,但是不知道从哪天开始,SD卡就被固化到智能手机的内部了,但是我们仍然把它称为外部存储.我想A ...

  10. gulp常用插件之gulp-rev-collector使用

    更多gulp常用插件使用请访问:gulp常用插件汇总 gulp-rev-collector这是一款根据gulp-rev生成的manifest.json文件中的映射, 去替换文件名称, 也可以替换路径. ...