[英]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終止的字符串。 要解決此問題,請用終止符的額外字符聲明sub1
和sub2
:
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.