strncpy()函数的问题(C语言)(strncpy question (C language))

2019-10-29 17:27发布

我在与函数strncpy困难。 我试图在一分为二的8个字符的字符串(前6个字符中一个子串,然后剩余的2个字符中的另一个)。 为了说明我已经简化了我的代码以下的特殊困难:

include stdio.h
include stdlib.h
include string.h

define MAXSIZE 100

struct word {  
   char string[8];  
   char sub1[2];  
   char sub2[6];  
};

typedef struct word Word;

int main(void)  
{  
   Word* p;  
   p=(Word*)malloc(MAXSIZE*sizeof(Word));  
   if (p==NULL) {  
      fprintf(stderr,"not enough memory");  
      return 0;  
   }  
   printf("Enter an 8-character string: \n");  
   scanf("%s",p->string);  

   strncpy(p->sub2,p->string,6);  
   strncpy(p->sub1,p->string,2);  
   printf("string=%s\n",p->string);  
   printf("sub1=%s\n",p->sub1);  
   printf("sub2=%s\n",p->sub2);  

   free(p);  

   return 0;  
}

用户被提示为输入。 假设他们输入“12345678”。 然后该程序的输出是:

string=1234567812123456  
sub1=12123456  
sub2=123456

我期待将如下的输出:

string=12345678  
sub1=12  
sub2=123456

我不明白怎么strncpy()函数似乎是附加的数字串......显然我不明白strncpy()函数不够好,但任何人都可以向我解释这是怎么回事?

Answer 1:

C字符串需要以空字符(0)被终止。

strncpy没有把空终止的字符串为您服务。 如果你想要一个2个字符的字符串,你需要为三个字符分配房间,并设置最后一个为空。

尝试这个:

struct word {
char string[9];
char sub1[3];
char sub2[7];
};

// ...
strncpy(p->sub2,p->string,6);
p->sub2[6] = 0;
strncpy(p->sub1,p->string,2);
p->sub1[2] = 0;
// ...

需要注意的是,如果用户输入比你分配的空间更多的字符,你将有问题的结束。



Answer 2:

您可能会发现,这部分strncpy的文档有用:

的函数strncpy()函数是类似的,除了在SRC的最多n个字节被复制。 警告:如果SRC的前n个字节之间没有空字节,放置在dest字符串就不会以空终止。

要打印的是不是空终止字符串。 为了解决这个问题声明sub1sub2与终止一个额外的字符:

char sub1[3];
char sub2[7];

然后空复印后终止:

strncpy(p->sub2,p->string,6);  
p->sub2[6] = '\0';
strncpy(p->sub1,p->string,2); 
p->sub1[2] = '\0';


Answer 3:

在从最S2 n个字符到s1的函数strncpy()函数的副本。 如果S2长小于n字符,则S1的剩余部分被填充有'\ 0' 字符。 否则,S1不会终止。

所以给你的字符串较长,字符串不是零终止。 当你打印出来,prinf是印刷复制的字符,但随后携带上印刷无论是在那里,直到它碰到NUL

Althoug scanf函数不NUL终止的字符串,你还没有分配足够的空间。 String在你的stuct必须有9个字符- 8字符(12345678)和一个多为NUL。 眼下NUL会str1中的第一个字符 - 你再与strncpy()函数覆盖



文章来源: strncpy question (C language)
标签: c string strncpy