首页 > 解决方案 > 复制的字符串是否以 '\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'。如果不是这样,那么像我在代码中所做的那样包含它是一个好习惯。

标签: c

解决方案


该声明

while ((to[i] = from[i]) != '\0')
    ++i;

首先分配 to 的值,from[i]然后to[i]分配的值与\0- 如果它是刚刚复制的空终止符,则循环结束。

因此

to[i] = '\0';

是不必要的,但在这里并非不正确。

但是,周围有不必要的代码并不是一种好的风格,因为它会使重构和推理其他代码变得更加困难。只是最后一个赋值的存在可能会让未来的读者误以为循环本身不足以正确终止字符串。

此外,如果有人来将代码编辑成

while ((*to++ = *from++));

正如 WhozCraig 所建议的那样,他们可能会错误地认为他们确实需要添加空终止符,这一次可能会超出范围:

*to++ = 0;

推荐阅读