C语言-字符串典型问题分析

时间:2023-03-09 05:54:06
C语言-字符串典型问题分析

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个参数时,如果第三个参数没有包含格式化信息,函数调用没有问题;相反,如果第三个参数包含了格式化信息,但缺少后续对应参数,则程序行为不确定。

C语言-字符串典型问题分析

应改为

     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'

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

C语言-字符串典型问题分析

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。

C语言-字符串典型问题分析

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 ;  
}