【问题标题】:C language and strings [duplicate]C语言和字符串[重复]
【发布时间】:2021-05-13 19:11:54
【问题描述】:
#include <stdio.h>
#include <string.h>

int main()
{
    char s3[12]="ABCDEISHERO";    
    char s4[5]="ABCDE";
    char* p=strstr(s3,s4);
    printf("%s",p);

    return 0;
}

我写了这段代码,但是根据strstr的功能,我们在字符串s3中有子字符串"ABCDE",但是为什么输出是(null)呢?我哪里错了?

【问题讨论】:

  • 提示:不要像这样声明具有固定长度的字符串。使用char s[] = "..." 并让编译器为您解决。你在这里猜错了长度。如果您不需要可变字符缓冲区,请改用char* s = "..."
  • 您的数组大小不考虑空终止符。
  • s4 需要有 6 个元素宽才能说明字符串终止符 - strstr 不匹配它,因为(很可能)最后一个字符后面有一个或多个非零字节,所以strstrs4 视为"ABCDEandabunchofothercharacters",而不是"ABCDE"
  • @tadman 不,使用const char *s = "..."
  • @AugustKarlstrom 理想情况下,是的。

标签: c initialization substring c-strings strstr


【解决方案1】:

s4 需要为 6 个元素宽以说明字符串终止符 - strstr 不匹配它,因为(很可能)最后一个字符后面有一个或多个非零字节,所以 strstrs4 视为"ABCDE???????",而不是"ABCDE"

约翰·博德回答。

【讨论】:

    【解决方案2】:

    此声明

    char s4[5]="ABCDE";
    

    在 C 中有效,但在 C++ 中无效。

    这个声明的问题是数组s4 不包含字符串。在 C 中,“字符串”表示“以 null 结尾的字节序列”,s4 没有空间来容纳用作初始化程序的字符串文字 '\0' 的终止零字符 '\0'

    因此调用函数strstr 期望两个参数都是指向字符串的指针会导致未定义的行为。

    随便写

    char s4[6]="ABCDE";
    

    甚至更好

    char s4[]="ABCDE";
    

    这是一个演示程序

    #include <stdio.h>
    #include <string.h>
    
    int main(void) 
    {
        char s3[12] = "ABCDEISHERO";    
        char s4[] = "ABCDE";
    
        char* p = strstr( s3, s4 );
    
        if ( p ) printf( "%s\n", p );
        
        return 0;
    }
    

    程序输出是

    ABCDEISHERO
    

    因为函数调用返回的strstr指针p指向字符数组的开头s3

    【讨论】:

    • 编辑了您的答案以解释 C 字符串是什么。如果 OP 不得不问这个问题,他们可能不知道正式的定义。
    • @HolyBlackCat 感谢您附加答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 2019-01-09
    相关资源
    最近更新 更多