首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >strncpy问题(C语言)

strncpy问题(C语言)
EN

Stack Overflow用户
提问于 2010-12-19 22:28:54
回答 3查看 1.8K关注 0票数 0

我对strncpy有困难。我尝试将一个8个字符的字符串拆分为两部分(一个子字符串中的前6个字符,然后是另一个子字符串中的其余2个字符)。为了说明特殊的困难,我将我的代码简化为以下代码:

代码语言:javascript
运行
复制
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“。然后,该程序的输出为:

代码语言:javascript
运行
复制
string=1234567812123456  
sub1=12123456  
sub2=123456

我期望的输出将如下所示:

代码语言:javascript
运行
复制
string=12345678  
sub1=12  
sub2=123456

我不明白strncpy是怎么把数字附加到字符串上的。显然我对strncpy的理解还不够深入,但是有人能给我解释一下到底是怎么回事吗?

EN

回答 3

Stack Overflow用户

发布于 2010-12-19 22:30:22

C字符串需要以空字符(0)结尾。

strncpy不会为您在字符串上放置空终止符。如果您想要2个字符的字符串,则需要为3个字符分配空间,并将最后一个字符设置为null。

试试这个:

代码语言:javascript
运行
复制
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;
// ...

请注意,如果用户输入的字符超过了您分配的空间,您将会遇到问题。

票数 6
EN

Stack Overflow用户

发布于 2010-12-19 22:31:44

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

strncpy()函数与

类似,不同之处在于最多复制n字节的src。警告:如果src的前n个字节中没有null字节,则放在dest中的字符串不会以null结尾。

您打印的字符串不是以null结尾的。要解决此问题,请使用终结符的额外字符声明sub1sub2

代码语言:javascript
运行
复制
char sub1[3];
char sub2[7];

然后在复制后为空终止:

代码语言:javascript
运行
复制
strncpy(p->sub2,p->string,6);  
p->sub2[6] = '\0';
strncpy(p->sub1,p->string,2); 
p->sub1[2] = '\0';
票数 2
EN

Stack Overflow用户

发布于 2010-12-19 22:35:54

函数的作用是:将最多n个字符从s2复制到s1。如果s2的长度小于n个字符,则s1的其余部分将填充`\0‘个字符。否则,不会终止s1。

因此,如果您的字符串较长,则字符串不会以零结尾。当您打印它们时,prinf将打印您复制的字符,然后继续打印任何内容,直到它命中NUL

尽管scanf没有NUL终止它的字符串,但是你没有分配足够的空间。结构中的String长度需要为9个字符-8个字符(12345678),另一个是NUL。现在NUL放在str1的第一个字符中--然后用strncpy覆盖它

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4483362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档