XCode strcpy ( char *dest, io_name_t src) 没有复制到目标
XCode strcpy ( char *dest, io_name_t src) not copying to dest
这一定是我的一个简单错误,因此我犹豫地使用了术语 "not working"。
这是我的代码,问题是从 io_name_t
变量到 char
数组的 strcpy 似乎不起作用,即数据未被复制。
定义结构以保存数据以供进一步使用:
static struct sUSBDevInfo {
char devName[200];
char svcPlane[200];
char othPlane[200];
int isScreen;
} USBDevInfo[99];
现在填充结构:
int getUSBDevices ()
{
int i = -1;
CFMutableDictionaryRef matchingDict;
io_iterator_t iter;
kern_return_t kr;
io_service_t device;
io_name_t deviceName;
io_string_t pathName;
matchingDict = IOServiceMatching(kIOUSBDeviceClassName);
if ( matchingDict == NULL)
{
return ( "No match" );
}
/* Now we have a dictionary, get an iterator.*/
kr = IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDict, &iter);
if (kr != KERN_SUCCESS)
{
return (0);
}
/* iterate */
while ((device = IOIteratorNext(iter)))
{
/* do something with device, eg. check properties */
/***Display the device names ***/
kr = IORegistryEntryGetName(device, deviceName);
if (KERN_SUCCESS != kr)
{
deviceName[0] = '[=13=]';
}
i++;
printf("\ndeviceName:%s",deviceName);
strcpy(USBDevInfo[i].devName, deviceName); /* !!! This and the following strcpy leave the dest variable unchanged !!! */
IORegistryEntryGetPath(device, kIOServicePlane, pathName);
strcpy(USBDevInfo[i].svcPlane, pathName);
IORegistryEntryGetPath(device, kIOUSBPlane, pathName);
strcpy(USBDevInfo[i].othPlane, pathName);
USBDevInfo[i].isScreen = isScreen(deviceName);
IOObjectRelease(device);
}
/* Done, release the iterator */
IOObjectRelease(iter);
return ( i );
}
当我调试时它显示 deviceName
具有预期值(例如 deviceName:Root Hub Simulation Simulation
),但是到 USBDevInfo[i].devName
的 strcpy 保持目标不变('[=20=]'
)。
编辑。
尝试过实验。复制到另一个局部变量有效,但不能复制到全局静态结构项:
char cpy[200]; /* local variable */
.
.
strcpy(cpy, deviceName); /* Works - copied to cpy */
strcpy(USBDevInfo[i].devName, deviceName); /* Not working */
USBDevInfo[i].devName[0] = deviceName[3]; /* Not working */
编辑 2
请参阅下面的答案。
编辑 2
修改了 header 文件以仅包含结构的类型定义。
typedef struct sUSBDevInfo {
char devName[400];
char svcPlane[400];
char othPlane[400];
int isScreen;
} tUSBDevInfo;
将结构变量声明移至 C 文件。
static tUSBDevInfo USBDevInfo[99];
现在 strcpy 可以工作了。
因此,将结构数组变量放在 header 中会导致代码无法更改数组中的值,但将其放在 c 文件中(作为全局变量)是可行的。
这一定是我的一个简单错误,因此我犹豫地使用了术语 "not working"。
这是我的代码,问题是从 io_name_t
变量到 char
数组的 strcpy 似乎不起作用,即数据未被复制。
定义结构以保存数据以供进一步使用:
static struct sUSBDevInfo {
char devName[200];
char svcPlane[200];
char othPlane[200];
int isScreen;
} USBDevInfo[99];
现在填充结构:
int getUSBDevices ()
{
int i = -1;
CFMutableDictionaryRef matchingDict;
io_iterator_t iter;
kern_return_t kr;
io_service_t device;
io_name_t deviceName;
io_string_t pathName;
matchingDict = IOServiceMatching(kIOUSBDeviceClassName);
if ( matchingDict == NULL)
{
return ( "No match" );
}
/* Now we have a dictionary, get an iterator.*/
kr = IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDict, &iter);
if (kr != KERN_SUCCESS)
{
return (0);
}
/* iterate */
while ((device = IOIteratorNext(iter)))
{
/* do something with device, eg. check properties */
/***Display the device names ***/
kr = IORegistryEntryGetName(device, deviceName);
if (KERN_SUCCESS != kr)
{
deviceName[0] = '[=13=]';
}
i++;
printf("\ndeviceName:%s",deviceName);
strcpy(USBDevInfo[i].devName, deviceName); /* !!! This and the following strcpy leave the dest variable unchanged !!! */
IORegistryEntryGetPath(device, kIOServicePlane, pathName);
strcpy(USBDevInfo[i].svcPlane, pathName);
IORegistryEntryGetPath(device, kIOUSBPlane, pathName);
strcpy(USBDevInfo[i].othPlane, pathName);
USBDevInfo[i].isScreen = isScreen(deviceName);
IOObjectRelease(device);
}
/* Done, release the iterator */
IOObjectRelease(iter);
return ( i );
}
当我调试时它显示 deviceName
具有预期值(例如 deviceName:Root Hub Simulation Simulation
),但是到 USBDevInfo[i].devName
的 strcpy 保持目标不变('[=20=]'
)。
编辑。
尝试过实验。复制到另一个局部变量有效,但不能复制到全局静态结构项:
char cpy[200]; /* local variable */
.
.
strcpy(cpy, deviceName); /* Works - copied to cpy */
strcpy(USBDevInfo[i].devName, deviceName); /* Not working */
USBDevInfo[i].devName[0] = deviceName[3]; /* Not working */
编辑 2
请参阅下面的答案。
编辑 2
修改了 header 文件以仅包含结构的类型定义。
typedef struct sUSBDevInfo {
char devName[400];
char svcPlane[400];
char othPlane[400];
int isScreen;
} tUSBDevInfo;
将结构变量声明移至 C 文件。
static tUSBDevInfo USBDevInfo[99];
现在 strcpy 可以工作了。
因此,将结构数组变量放在 header 中会导致代码无法更改数组中的值,但将其放在 c 文件中(作为全局变量)是可行的。