सीखने के बाद कि strncmp
दोनों ऐसा नहीं लगता है और strlcpy
मेरे ऑपरेटिंग सिस्टम (लिनक्स) पर उपलब्ध नहीं है, मुझे लगा कि मैं इसे स्वयं कोशिश कर सकता हूं और लिख सकता हूं।सी अजीब सरणी व्यवहार
मुझे लिबिक रखरखाव, Ulrich Drepper से उद्धरण मिला, जिसने mempcpy
का उपयोग करके strlcpy
का विकल्प पोस्ट किया। मेरे पास mempcpy
नहीं है, लेकिन इसका व्यवहार दोहराना आसान था। इस, सबसे पहले testcase मैं
#include <stdio.h>
#include <string.h>
#define BSIZE 10
void insp(const char* s, int n)
{
int i;
for (i = 0; i < n; i++)
printf("%c ", s[i]);
printf("\n");
for (i = 0; i < n; i++)
printf("%02X ", s[i]);
printf("\n");
return;
}
int copy_string(char *dest, const char *src, int n)
{
int r = strlen(memcpy(dest, src, n-1));
dest[r] = 0;
return r;
}
int main()
{
char b[BSIZE];
memset(b, 0, BSIZE);
printf("Buffer size is %d", BSIZE);
insp(b, BSIZE);
printf("\nFirst copy:\n");
copy_string(b, "First", BSIZE);
insp(b, BSIZE);
printf("b = '%s'\n", b);
printf("\nSecond copy:\n");
copy_string(b, "Second", BSIZE);
insp(b, BSIZE);
printf("b = '%s'\n", b);
return 0;
}
है और यह अपने परिणाम है:
Buffer size is 10
00 00 00 00 00 00 00 00 00 00
First copy:
F i r s t b =
46 69 72 73 74 00 62 20 3D 00
b = 'First'
Second copy:
S e c o n d
53 65 63 6F 6E 64 00 00 01 00
b = 'Second'
आप आंतरिक प्रतिनिधित्व में देख सकते हैं (लाइनों insp()
बनाई गई) वहाँ कुछ शोर में मिलाया, की तरह है कि पहली प्रतिलिपि के बाद निरीक्षण में printf()
प्रारूप स्ट्रिंग, और दूसरी प्रति में एक विदेशी 0x01।
तारों को बरकरार रखा गया है और यह सही ढंग से बहुत लंबे स्रोत तारों को संभालता है (चलिए 0 के लिए copy_string
की लंबाई 0 के साथ संभावित समस्या को अनदेखा करते हैं, मैं इसे बाद में ठीक कर दूंगा)।
लेकिन मेरे गंतव्य के अंदर विदेशी सरणी सामग्री (प्रारूप स्ट्रिंग से) क्यों हैं? ऐसा लगता है कि गंतव्य वास्तव में नई लंबाई से मेल खाने के लिए संशोधित किया गया था।
एक विदेशी सरणी क्या है? – WhirlWind
इस मामले में मेरा मतलब है printf से स्ट्रिंग अक्षर, अर्थात् "बी = '% s'", जिसे मेरी सरणी "बी" के साथ "इंटरमीक्स" मिला, गंतव्य – LukeN
नोट करें कि 'strlcpy() 'और' strlcat () 'उदार लाइसेंस के तहत बहुत आसानी से उपलब्ध है: http://www.openbsd.org/cgi-bin/cvsweb/~checkout~/src/lib/libc/string/strlcpy.c?content-type=text%2Fplain –