无法将 PathFindExtensionW 输出分配给 WCHAR 数组
Can't assign PathFindExtensionW output to an array of WCHAR
我想将 PathFindExtensionW
api 的输出分配给一个 WCHAR 数组。这个 api return 一个 LPWSTR 指针。我搜索并找出将 LPWSTR 分配给 WCHAR 数组的方法如下:
WCHAR array[100] = PathFindExtensionW(,,,)
但它对我不起作用,我收到此错误:
表达式必须是可修改的左值
我用的是VS 2012,我的代码如下:
#include <windows.h>
#include <iostream>
#include "Shlwapi.h"
#pragma comment(lib,"shlwapi.lib")
void main(int argc, char *argv[]){
int iToSizeB = 0;
iToSizeB = MultiByteToWideChar(CP_UTF8, 0, argv[1], -1 , NULL, 0);
WCHAR lpFileAddress[260] = {0};
MultiByteToWideChar(CP_UTF8, 0, argv[1], -1, lpFileAddress, iToSizeB);
WCHAR lpDotPosition[260] = {0};
//this line must be correct but I receive error
lpDotPosition = PathFindExtensionW(lpFileAddress);
int iToSizeW = 0;
iToSizeW = WideCharToMultiByte(CP_UTF8, 0, lpDotPosition, -1, NULL, 0, NULL, NULL);
CHAR lpExtension[260] = {0};
WideCharToMultiByte(CP_UTF8, 0, lpDotPosition, -1, lpExtension, iToSizeW, NULL, NULL);
printf("the format is:\n");
printf(lpExtension);
printf("\n");
getchar();
}
这有什么问题?
感谢您的解决方案。
您不能通过分配指向数组的指针来填充数组。您必须复制数据,例如使用 lstrcpynW()
或类似的功能:
LPCWSTR lpDotPosition = PathFindExtensionW(lpFileAddress);
WCHAR lpExtensionW[MAX_PATH] = {0};
lstrncpy(lpExtensionW, lpDotPosition, MAX_PATH);
然而,PathFindExtension()
只是returns你传入的字符串缓冲区中的一个指针,所以不需要分配一个单独的扩展副本,数据已经预先分配好了,只要输入字符串有效,返回的指针将保持有效:
#include <windows.h>
#include <iostream>
#include <Shlwapi.h>
#pragma comment(lib, "shlwapi.lib")
int main(int argc, char *argv[])
{
WCHAR lpFileAddress[MAX_PATH] = {0};
int iToSizeB = MultiByteToWideChar(CP_UTF8, 0, argv[1], -1, lpFileAddress, MAX_PATH);
LPCWSTR lpDotPosition = PathFindExtensionW(lpFileAddress);
CHAR lpExtension[MAX_PATH] = {0};
int iToSizeW = WideCharToMultiByte(CP_UTF8, 0, lpDotPosition, -1, lpExtension, MAX_PATH, NULL, NULL);
printf("the format is:\n%s\n", lpExtension);
getchar();
return 0;
}
另一方面,不需要使用 MultiByteToWideChar()
和 WideCharToMultiByte()
来搜索 char
字符串,您可以使用 PathFindExtensionA()
代替:
#include <windows.h>
#include <iostream>
#include <Shlwapi.h>
#pragma comment(lib, "shlwapi.lib")
int main(int argc, char *argv[])
{
LPCSTR lpExtension = PathFindExtensionA(argv[1]);
printf("the format is:\n%s\n", lpExtension);
getchar();
return 0;
}
我想将 PathFindExtensionW
api 的输出分配给一个 WCHAR 数组。这个 api return 一个 LPWSTR 指针。我搜索并找出将 LPWSTR 分配给 WCHAR 数组的方法如下:
WCHAR array[100] = PathFindExtensionW(,,,)
但它对我不起作用,我收到此错误:
表达式必须是可修改的左值
我用的是VS 2012,我的代码如下:
#include <windows.h>
#include <iostream>
#include "Shlwapi.h"
#pragma comment(lib,"shlwapi.lib")
void main(int argc, char *argv[]){
int iToSizeB = 0;
iToSizeB = MultiByteToWideChar(CP_UTF8, 0, argv[1], -1 , NULL, 0);
WCHAR lpFileAddress[260] = {0};
MultiByteToWideChar(CP_UTF8, 0, argv[1], -1, lpFileAddress, iToSizeB);
WCHAR lpDotPosition[260] = {0};
//this line must be correct but I receive error
lpDotPosition = PathFindExtensionW(lpFileAddress);
int iToSizeW = 0;
iToSizeW = WideCharToMultiByte(CP_UTF8, 0, lpDotPosition, -1, NULL, 0, NULL, NULL);
CHAR lpExtension[260] = {0};
WideCharToMultiByte(CP_UTF8, 0, lpDotPosition, -1, lpExtension, iToSizeW, NULL, NULL);
printf("the format is:\n");
printf(lpExtension);
printf("\n");
getchar();
}
这有什么问题?
感谢您的解决方案。
您不能通过分配指向数组的指针来填充数组。您必须复制数据,例如使用 lstrcpynW()
或类似的功能:
LPCWSTR lpDotPosition = PathFindExtensionW(lpFileAddress);
WCHAR lpExtensionW[MAX_PATH] = {0};
lstrncpy(lpExtensionW, lpDotPosition, MAX_PATH);
然而,PathFindExtension()
只是returns你传入的字符串缓冲区中的一个指针,所以不需要分配一个单独的扩展副本,数据已经预先分配好了,只要输入字符串有效,返回的指针将保持有效:
#include <windows.h>
#include <iostream>
#include <Shlwapi.h>
#pragma comment(lib, "shlwapi.lib")
int main(int argc, char *argv[])
{
WCHAR lpFileAddress[MAX_PATH] = {0};
int iToSizeB = MultiByteToWideChar(CP_UTF8, 0, argv[1], -1, lpFileAddress, MAX_PATH);
LPCWSTR lpDotPosition = PathFindExtensionW(lpFileAddress);
CHAR lpExtension[MAX_PATH] = {0};
int iToSizeW = WideCharToMultiByte(CP_UTF8, 0, lpDotPosition, -1, lpExtension, MAX_PATH, NULL, NULL);
printf("the format is:\n%s\n", lpExtension);
getchar();
return 0;
}
另一方面,不需要使用 MultiByteToWideChar()
和 WideCharToMultiByte()
来搜索 char
字符串,您可以使用 PathFindExtensionA()
代替:
#include <windows.h>
#include <iostream>
#include <Shlwapi.h>
#pragma comment(lib, "shlwapi.lib")
int main(int argc, char *argv[])
{
LPCSTR lpExtension = PathFindExtensionA(argv[1]);
printf("the format is:\n%s\n", lpExtension);
getchar();
return 0;
}