テキスト ファイルに URL のリストがあり、それらをホストとページとして構造に保存しようとしています。このコードに問題があります。sigsegvを返します。何か案は?
char buf[100];
.......
while ( fgets ( buf, 100, fin ) != NULL )
{
buf [ strlen (buf) - 1 ] = '\0';
informatii.intrari++;
informatii.urluri[informatii.intrari-1].status=-1;
printf("BUFFER: %s\n", buf);
if( strncmp ("http://",buf,7) == 0 )
memmove (buf, buf+7, strlen (buf));
if( strncmp("https://",buf,8) == 0 )
memmove (buf, buf+8, strlen (buf));
printf("BUFFER: %s\n", buf);
if ( strchr ( buf , '/' ) == NULL)
{
strcpy ( informatii.urluri [ informatii.intrari - 1 ].host, buf);
strcpy ( informatii.urluri [ informatii.intrari - 1 ].page, "/");
}
else
{
memmove ( informatii.urluri [ informatii.intrari - 1 ].page,
buf+(strchr ( buf , '/' )-buf),
strlen(buf) );
}
memset(buf , 0 , 100 );
}
OPコメントから構造を編集
struct urlinfo
{
unsigned short status;
char* serror;
char host[100];
char page[100];
};
struct informati
{
int intrari;
int time;
char* email;
struct urlinfo urluri[50];
} informatii;
編集終了
編集:あなたのアドバイスのいくつかに従った後、私はそれを機能させることができましたが、理解できないことがいくつかあります. これが最終的なコードです。
`struct urlinfo
{
unsigned short status;
char* serror;
char host[100];
char page[100];
};
struct informati
{
int intrari;
int time;
char* email;
struct urlinfo urluri [MAX_URLS];
}informatii;
int configurare(char* fisier)//citim si memoram fisierul de configurare
{
FILE* fin;
char buf[100];
char* temp;
int i;
if((fin = fopen(fisier,"r")) == NULL)//verificam fisierul de intrare
{
printf("Eroare la fisierul de configurare.Se va folosi fisierul default configurare.txt.\n");
fin = fopen("configurare.txt","r");
}
informatii.intrari = 0;
informatii.time = 30;
informatii.email = NULL;`
while ( fgets ( buf, 100, fin ) != NULL )
{
//buf [ strlen (buf) - 1 ] = '\0';
if (informatii.intrari >= 50) {
printf("URLs overflow...!\n");
break;}
informatii.urluri[ informatii.intrari ].status=-1;
informatii.urluri[ informatii.intrari ].serror= NULL;
if( strncmp ("http://",buf,7) == 0 )
memmove (buf, buf+7, strlen (buf) );
if( strncmp("https://",buf,8) == 0 )
memmove (buf, buf+8, strlen (buf) );
temp = strchr ( buf , '/' );
if ( temp == NULL)
{
memcpy ( informatii.urluri [ informatii.intrari ].host, buf,strlen(buf)+1);
strncpy ( informatii.urluri [ informatii.intrari ].page, "/\0",2);
}
else
{
memcpy ( informatii.urluri [ informatii.intrari ].host, buf,strlen(buf)-strlen(temp));
memmove ( informatii.urluri [ informatii.intrari ].page, temp, strlen(temp));
}
informatii.intrari++;
memset(buf , '\0' , 100 );
}
}
fclose(fin);
return 0;
}`
printf を使用するときにトレイリング '\n' を削除するためにこれを使用buf [ strlen (buf) - 1 ] = '\0';
すると、文字列の最初の文字が印刷されません (たとえば、printf(" Buf %s", buf) がある場合、"uf " が印刷されます)。そして、buf 文字列をif( strncmp ("http://",buf,7) == 0 )
memmove (buf, buf+7, strlen (buf) -7 );
再度使用しようとすると、間違った戻り文字列が返され、文字列の末尾の文字が文字列の '\n' 文字の後にコピーされます。