如何将指向 const char * [] 的指针连接到字符串数组中的数据

问题描述 投票:0回答:1

我正在尝试检索以字符串形式存储在 ESP32 SD 卡上的无线电 URL 链接列表,这些字符串位于引号内,并以逗号和新行分隔。 即每行一个 url。 我可以打开 URL_LIST.TXT 文件并将 URL 放入字符串数组中,

String url[100];

通过使用SD.H文件打开、读取和字符串解析命令。然而,我正在使用的 ESP32 音频套件需要通过 const char 指针连接的 url,

const char *urls[] = {http://urlstation1","http://urlstation2",...,http://lastStation"}

其中 url 是在代码内部定义的,而不是从 SD 卡读取。

我尝试创建一个字符数组 char u[100][255] 以允许最多 100 个 url 地址。每个长度最多可达 255 个字符。即使值的 Serial.Println 看起来没问题,下面的代码也会失败。
...

  int readurls(String url[],char u[100][255]){
  File url_list = SD.open("/URLs/URL_LIST.txt");
  String str;
  String a_url;
  int count = 0;
  while (url_list.available() && count < MAX_LINES) {
    str= url_list.readStringUntil('\n');
    //Serial.println(str);
    int delim = str.indexOf(',');
    //a_url=str.substring(0,delim);
    //needed to eliminate the quotes from the strings
    a_url=str.substring(3,delim-1);
    url[count] = a_url;
    // works to this point - that is String Array looks correct 
    a_url+="\0"; // tried to add a null pointer several ways
    //Serial.println(url[count].c_str());
    char ubuf[a_url.length()+1]="";
    a_url.toCharArray(ubuf,a_url.length()+1);
    strncpy(u[count],ubuf,sizeof(u[count]));
    //u[count]=url[count].c_str();
    urls[count]=u[count];
    count++;
  }
  close(url_list);
  return(count);
  }

希望各位专家能告诉我我做错了什么。当使用初始化值在代码内部定义 url 时,使用 url 指针的驱动程序将播放音乐流。

当在文本文件中定义 url 并且指向 url 指针以从字符数组获取值时,该 url 不会播放音乐。 在这两种情况下打印单个站点的 urls[index] 会显示看起来相同的值,因此隐藏的内容丢失或未正确完成。

esp32 internet-radio
1个回答
0
投票

您的代码不起作用,因为您尝试将

String
的实例分配给 char 数组:

url[count] = a_url;

这不起作用 - char 数组只是字节的连续部分,而不是像

String
那样的类实例。

相反,您应该首先使用

String
方法将
.c_str()
转换为 char 数组,该方法返回一个以 null 结尾的 char 数组(基本上是一个 ascii 值数组),然后使用
 将其复制到目标数组strcpy

以下是根据上述建议修改的代码(免责声明:我没有对此进行测试,因为我不方便访问适当的硬件)

int readurls(String url[],char u[100][255]){
  File url_list = SD.open("/URLs/URL_LIST.txt");
  String str;
  String a_url;
  int count = 0;
  while (url_list.available() && count < MAX_LINES) {
    str = url_list.readStringUntil('\n');
    //Serial.println(str);
    int delim = str.indexOf(',');
    //a_url=str.substring(0,delim);
    //needed to eliminate the quotes from the strings
    a_url = str.substring(3,delim-1);
   
    // Note: must copy the characters, cannot assign because array is not a class but a raw array
    strcpy(url[count], a_url.c_str());
    count++;
  }
  close(url_list);
  return(count);
}
© www.soinside.com 2019 - 2024. All rights reserved.