簡體   English   中英

strncpy問題(C語言)

[英]strncpy question (C language)

我在使用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,但是有人可以向我解釋發生了什么嗎?

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

strncpy不會為您在字符串上放置空終止符。 如果要使用2個字符的字符串,則需要為3個字符分配空間,並將最后一個設置為null。

嘗試這個:

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;
// ...

請注意,如果用戶輸入的字符數超出了您分配的空間,那么最終會遇到問題。

您可能會發現strncpy文檔的這一部分很有用:

除了最多復制n個src字節外,strncpy()函數與之類似。 警告:如果src的前n個字節中沒有空字節,則放置在dest中的字符串將不會以空終止。

您正在打印不以null終止的字符串。 要解決此問題,請用終止符的額外字符聲明sub1sub2

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

然后null在復制后終止:

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

strncpy()函數最多將n個字符從s2復制到s1。 如果s2的長度少於n個字符,則s1的其余部分將填充'\\ 0'個字符。 否則,s1不會終止。

因此,鑒於您的字符串更長,這些字符串不會以零結尾。 當您打印它們時,prinf會打印您復制的字符,然后繼續打印存在的所有內容,直到遇到NUL

Althoug scanf確實NUL終止了它的字符串,您沒有分配足夠的空間。 String長度必須為9個字符-字符(12345678)為8個字符,NUL為1個字符。 現在,NUL進入了str1的第一個字符-然后您可以用strncpy覆蓋它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM