我試圖用字串填充二維陣列,問題是我設法填充了第一個索引,但是當我繼續下一個字串時,它會不斷更改以前的索引。可能是指標的問題,這是相關的代碼。
char* get_song_name(const char* song)
{
strip(song);
FILE* fp = fopen(song, "r");
char str[9999];
while(!feof(fp))
{
fgets(str,9999,fp);
puts(str);
strip(str);
char* s = str;
return s;
}
` DIFFERENT FUNCTION:
for(i=0;i<lines;i )
{
char *st = fgets(buff, 250, fp);
st = create_path("c:\\Users\\Marian\\Desktop\\beatles", st);
name[i] = get_song_name(st); //WORKS HOWEVER CHANGES PRVIOUS INDEXES VALUE TOO
}`
uj5u.com熱心網友回復:
您需要動態分配字串,使其生命周期不會結束,然后函式退出。
只需更換
return s;
和
return strdup(s);
編輯
由于string.h這里不允許使用 OP,因此可以strdup()在https://stackoverflow.com/a/37132824/4989451 中找到實作
#include <stdlib.h>
char *ft_strdup(char *src)
{
char *str;
char *p;
int len = 0;
while (src[len])
len ;
str = malloc(len 1);
p = str;
while (*src)
*p = *src ;
*p = '\0';
return str;
}
uj5u.com熱心網友回復:
這個功能
char* get_song_name(const char* song)
可以呼叫未定義的行為,因為它回傳一個無效的指標,該指標指向函式的本地陣列,該陣列在退出函式后將不存在
char str[9999];
//...
char* s = str;
return s;
此外,該函式始終回傳相同的指標(本地陣列的第一個元素的地址)。所以這個回圈
for(i=0;i<lines;i )
{
char *st = fgets(buff, 250, fp);
st = create_path("c:\\Users\\Marian\\Desktop\\beatles", st);
name[i] = get_song_name(st); //WORKS HOWEVER CHANGES PRVIOUS INDEXES VALUE TOO
}`
沒有意義。
您需要在函式內動態分配一個字符陣列,get_song_name一個將從函式回傳的指標。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/372823.html
下一篇:C中陣列初始化的區別
