我在分配的RAM中有一些元数据(mplayer的输出),我正在尝试设置一些指向其中包含的字符串的指针。到目前为止,我已经将这些指针声明为char *
,虽然我不确定它们是否应该是void *
,但无论如何代码然后向前扫描并用下面的换行符替换传统上终止字符串为零,以便程序的其余部分可以使用它。
我的问题是:当找不到关键字时,相关指针将没有被正确分配,因此可能指向任何地方。我试图通过最初使用meta[which]=NULL;
将其设置为NULL来解决此问题。这更加复杂,因为它们有三个。我不确定meta [2]是第二个字符串的第一个字符,还是第零个字符串中的第二个字符。无论如何,它不能正常工作。
以下是代码:
if (malc) // Locate the strings of metadata information in the memory.
{
int which;
char keyword[3][23]={"ANS_metadata/artist=","ANS_metadata/title=","ANS_path="};
for (which=0;which<3;which++)
{
int memc,strc;
meta[which]=NULL;
for (memc=0,strc=0;memc<MPLAYER_MEM;memc++)
{
if (keyword[which][strc]) // Not Zero while string match is incomplete.
{
if (*(malc+memc)==keyword[which][strc])
strc++;
else
strc=0;
}
else // If we reach the end of the keyword, then we've found it.
{
meta[which]=malc+memc; // Find the end of the line and
while (*(malc+memc)!=LINEFEED) // terminate it more conventionally.
memc++; // Now meta[] points to our strings.
*(malc+memc)=0;
break;
}
}
}
}
有人有任何想法吗?三江源。
编辑:对不起,伙计们,我忘了这些:char *malc=malloc(MPLAYER_MEM);
char *meta[2];
编辑:添加break
。
答案 0 :(得分:0)
你有3个关键字,所以meta也需要长度为3:
char *meta[3];
使用NULL表示缺少关键字是正确的方法。
答案 1 :(得分:0)
我不太明白,但如果你有这些元数据:
ANS_metadata/title=test2\nANS_metadata/artist=this is a test\nunused_metadata=unused\nANS_path=test4
并想要这个结果:
0:ANS_metadata/artist=this is a test
1:ANS_metadata/title=test2
2:ANS_path=test4
你可以这样做:
#include <string.h>
#include <stdio.h>
#define LINEFEED '\n'
#define NB_META (3)
int main(char** argv,int argc) {
char* meta[NB_META]={NULL};
char malc[]="ANS_metadata/title=test2\nANS_metadata/artist=this is a test\nunused_metadata=unused\nANS_path=test4";
if (malc) { // Locate the strings of metadata information in the memory.
char* keyword[NB_META]={"ANS_metadata/artist=","ANS_metadata/title=","ANS_path="};
int MPLAYER_MEM = strlen(malc);
for(int which=NB_META;which;--which) {
int len = strlen(keyword[which]);
char* addr = malc;
char* endAddr= addr+MPLAYER_MEM-len;
while( (addr <= endAddr)
&& ( 0 != strncmp( keyword[which],addr,len) ) )
{addr++;}
if(addr <= endAddr) {
meta[which]=addr; // Find the end of the line and
while (*addr!=LINEFEED) { // terminate it more conventionally.
addr++; // Now meta[] points to our strings.
}
*addr=0;
printf("%d : %s\n",which,meta[which]);
} } }
return 0;
}