c - 在 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。提前致谢!
解决方案
char filename[8];
不初始化数组,因此不能保证它包含任何零字节。您必须使用= {}
or将数组初始化为零= ""
。
此外,4 个字节不足以存储".txt"
or "2020"
。您需要 5 个字节,以便您还可以存储终止符,所以char frmt[5] = ".txt";
.
推荐阅读
- bash - 使用 Awk 减去两行中的值
- newline - Telethon 短信换行
- javascript - 在 Node.js 中实现 Paypal 和 Stripe 的最佳方式是什么?
- react-native - 使用 VS Appcenter 构建 React Native App - p12 密码错误?
- reactjs - 我想制作一个呈现所有数据的 FlatList
- c# - 如何为返回十进制的 IActionResult 控制器操作创建单元测试?
- r - 使用 POSIXct 类更改 R 中的日期时间格式
- node.js - 使用 kafkajs 的 RequestReply 模式
- javascript - HTML 和 Javascript:打开文件资源管理器以允许用户选择目录而不仅仅是文件,没有 webkitdirectory 属性?
- java - 如何修复“字段列表”错误 Glassfish 服务器中的未知列