首页 > 解决方案 > 在 C 中处理字符串、strcat 和终止 null 的奇怪行为!(#初学者)

问题描述

我是从 PHP、Ruby 和 JavaScript 编程过来的,我真的发现自己对 C 语言不知所措,尤其是在处理字符串方面。

深入了解它,我想从用户那里获得输入并存储一个具有该名称的文本文件;然而,一切都发生了,但事实并非如此。确切地说,就我自己的理解而言,它是终止的 null 转换为 � 字符。

这是一个独立的错误示例:

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

int main()
{
    char year[4];
    scanf("%s", &year);
    char filename[8] = {};
    strcat(filename, year);
    char frmt[4] = ".txt";
    strcat(filename, frmt);
    printf("%s", filename);
    return 0;
}

从我的终端:

$ gcc bug.c
$ ./a.out
2020
2020.txt2020

这是另一个错误的例子:

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

int main()
{
    char year[4];
    scanf("%s", &year);
    char filename[8];
    strcat(filename, year);
    strcat(filename, ".txt");
    printf("%s", filename);
    return 0;
}

这里的结果是这样的:�2020.txt

至少在我的背景下,修复是非常不寻常的:将第 10 行更改为char filename[8] = {};

然而,最奇怪的是,同样的修复在更广泛的代码上下文中不起作用:https ://vitualizersgit.xyz/teaching/sakile-c/-/blob/master/terminal.c

在那里,完全相同的代码,甚至远程功能都不一样!那里filename变成“2020�.txt”,这意味着它strcat没有覆盖终止的 null

我严重困惑!

PS。提前致谢!

标签: cstring

解决方案


char filename[8];不初始化数组,因此不能保证它包含任何零字节。您必须使用= {}or将数组初始化为零= ""

此外,4 个字节不足以存储".txt"or "2020"。您需要 5 个字节,以便您还可以存储终止符,所以char frmt[5] = ".txt";.


推荐阅读