为什么 strcat 函数将指针移动到下一个字符?

问题描述

所以,我的问题很简单,我不知道为什么第一段代码不能正常工作。 程序从管道中读取一个 12 个字符的字符串,每次执行该函数时,strcat 函数都会将 buff 的指针从第一个字符移动到下一个字符,因此在几次交互之后,读取函数使程序失败,因为缓冲区是不够大了。 使用 sprintf 函数和另一个字符串解决了这个问题,但我不明白是什么导致了这个问题。 感谢您的帮助。

int n; 
char buff[15];
close(fd[1]);
    while(n = read(fd[0],buff,12) > 0){      
        strcat(buff,"\n");
        write(1,13); 
        buff[0] = '\0'; 
        }
int n; 
char buff[15];
char output[15];
close(fd[1]);
while(n = read(fd[0],12) > 0){      
            sprintf(output,"%s\n",buff); 
            write(1,output,13); 
            buff[0] = '\0';       
        }

解决方法

正确的代码终止缓冲区,假定缓冲区包含读取的字符串:

int n;
char buff[15];
close(fd[1]);
while((n = read(fd[0],buff,12)) > 0){
    buff[n] = '\0'; /* add terminating null-character */
    strcat(buff,"\n");
    write(1,n+1);
}

int n;
char buff[15];
char output[15];
close(fd[1]);
while((n = read(fd[0],12)) > 0){
    buff[n] = '\0'; /* add terminating null-character */
    sprintf(output,"%s\n",buff);
    write(1,output,n+1);
}
  • 注意分配给 ( 的额外 )n
  • 注意使用 n实际读取的字符数
  • 注意,正如 Mike 所说,字符串的终止。
, strcat

%ssprintf 说明符需要 strings,这意味着 C 中的“空终止 字符序列” .

如果管道中的内容不能保证以空字符结尾,则必须添加终止空字符。

int n;
char buff[15];
close(fd[1]);
while(n = read(fd[0],12) > 0){
    buff[12] = '\0'; /* add terminating null-character */
    strcat(buff,13);
    buff[0] = '\0';
}
int n;
char buff[15];
char output[15];
close(fd[1]);
while(n = read(fd[0],12) > 0){
    buff[12] = '\0'; /* add terminating null-character */
    sprintf(output,13);
    buff[0] = '\0';
}