c - 复制的字符串是否以 '\0' 结尾(第 1.9 节 C 编程语言 K&R2)
问题描述
在 复制函数的最后一行中,我在复制字符串的末尾存储了一个'\0',这原本不在代码中。
include <stdio.h>
#define MAXLINE 1000 /* maximum input line size */
int getline(char line[ ], int maxline);
void copy(char to[ ], char from[ ]);
/* print longest input line*/
int main()
{
int len; /* current line length */
int max; /* maximum length seen so far */
char line[MAXLINE]; /*current input line*/
char longest[MAXLINE]; /* longest line saved here */
max=0;
while ((len=getline(line, MAXLINE)) > 0)
if (len > max)
{
max=len;
copy(longest, line);
}
if (max>0) /* there was a line*/
printf("%s", longest);
return 0;
}
/* getline: read a line into s, return length */
int getline(char s[ ], int lim)
{
int c,i;
for(i=0; i<lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
s[i]=c;
if(c=='\n')
{
s[i]=c;
++i;
}
s[i]='\0';
return i;
}
/* copy: copy 'from' into 'to'; assume to is big enough */
void copy(char to[], char from[])
{
int i;
i=0;
while((to[i]=from[i])!='\0')
++i;
to[i] = '\0'; /*<-----Problematic Area*/
}
我的问题是,复制的字符串最后是否已经包含一个 '\0'。如果不是这样,那么像我在代码中所做的那样包含它是一个好习惯。
解决方案
该声明
while ((to[i] = from[i]) != '\0')
++i;
首先分配 to 的值,from[i]
然后to[i]
将分配的值与\0
- 如果它是刚刚复制的空终止符,则循环结束。
因此
to[i] = '\0';
是不必要的,但在这里并非不正确。
但是,周围有不必要的代码并不是一种好的风格,因为它会使重构和推理其他代码变得更加困难。只是最后一个赋值的存在可能会让未来的读者误以为循环本身不足以正确终止字符串。
此外,如果有人来将代码编辑成
while ((*to++ = *from++));
正如 WhozCraig 所建议的那样,他们可能会错误地认为他们确实需要添加空终止符,这一次可能会超出范围:
*to++ = 0;
推荐阅读
- c++ - switch 语句结束和下一个语句之间的时间是否确定(与路径无关)?
- html - 我可以在定义列表中使用子标题吗?
- android - 使用现有的 proguard 设置启用 R8 时应用程序崩溃
- python - 如何将 n 维数组除以整数值?
- java - "java" 与 intern() 的字符串比较是错误的
- hyphenation - 在 DocRaptor API 中无法使用的外部语言的 Prince XML 连字符
- linux - 未找到 mingw32[64] 安装
- html - 卸载然后重新安装软件包后,我开始收到“在'@angular/core'中找不到导出”
- css - React Native 使用 Image 作为图层
- typescript - 打字稿我可以在数组中重新定义 T
在界面中