c - 无法将 PathFindExtensionW 输出分配给 WCHAR 数组
问题描述
我想将PathFindExtensionW
api 的输出分配给 WCHAR 数组。这个 api 返回一个 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()
只需在您传入的字符串缓冲区内返回一个指针,因此无需分配扩展的单独副本,数据已经预先分配,并且返回的指针将在输入期间保持有效字符串有效:
#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()
andWideCharToMultiByte()
只是为了搜索一个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;
}
推荐阅读
- c++ - gRPC SSL 客户端 Windows 32 位 C++ 应用程序崩溃,错误整数除以零
- laravel - 我的 app-admin.blade.php 试图从非对象中获取“全名”属性
- reactjs - react-router-keycloak 是否支持 PKCE?
- modulo - 模块 ishi 横幅块
- python - tkinter- 将条目小部件值传递给另一个类
- c# - 正则表达式仅允许 C# 中的一位数或两位数和逗号
- javascript - 选择选项值属性可以是变量吗?
- scala - Spark Scala EMR 作业因 org.apache.spark.shuffle.FetchFailedException 而失败
- teiid - Teiid Springboot 与 Postgres
- reactjs - Ionic w/ React Trigger 无限滚动直到页面被填满