char *ft_between(char *str, size_t from, size_t to)
{
char *between;
between = malloc(16);
while ((from >=0) && (from < to) && (to < ft_strlen(str)))
{
*(between ) = str[from ];
}
*between = '\0';
printf("%s\n", between); // print nothing
printf("%s\n", between - 16); // print between but never had to do this before...
return (between);// even on calling function the pointer still at end of string
}
我認為這是因為我更改了使用 之間的地址,但我通常這樣做并且從未有過這種行為......是因為 malloc 嗎?
有什么我想念的嗎?如果我通過計數器來“倒帶”字串lol,是否有一種方法,即。之間[counter ] = str[from ]; 它有效,但我想通過指標來做,因為它更快......從我的紅色!
在這個例子中 str 用 迭代直到最后添加 char 但是當在呼叫函式中回傳時 printf 將列印所有 str
void ft_nbr2str(char *str, size_t nbr, char *base, size_t base_len)
{
if (nbr >= base_len)
{
ft_nbr2str(str, (nbr / base_len), base, base_len);
while (*str != '\0')
str ;
*str = base[nbr % base_len];
}
else
*str = base[nbr];
}
uj5u.com熱心網友回復:
我認為是因為我更改了使用 之間的地址
這是因為您修改了via運算子的值。該值是其他東西的地址。不能修改地址或任何其他物件。between between
但我通常這樣做,從來沒有這種行為。
你描述的行為是絕對正常的,所以要么不,你通常不這樣做,要么是的,你確實有這種行為。在您的代碼中,您將在from. 我真的不明白為什么在您執行后*between = '\0';會立即printf("%s\n", between)列印一個非空字串。 malloc與它沒有特別的關系。
我推測在其他情況下,您可能已經修改了指標的副本,這自然不會修改原始指標。可能您通過將指標(按值)傳遞給另一個函式來做到這一點。例子:
void strcpy_range(char *dest, char *src, size_t from, size_t to) {
while ((from >=0) && (from < to) && (src[from] != '\0'))
{
*(dest ) = src[from ]; // dest is modified
}
*dest = '\0';
}
char *ft_between(char *str, size_t from, size_t to)
{
char *between = malloc(16);
strcpy_range(between, str, from, to);
printf("%s\n", between); // prints the extracted substring
return between; // returns a pointer to the extracted substring
}
如果您想在不引入新函式的情況下挽救原始版本,請使用臨時變數來跟蹤子字串中的當前位置。例如,
char *ft_between(char *str, size_t from, size_t to)
{
char *between = malloc(16);
char *temp = between;
while ((from >=0) && (from < to) && (to < ft_strlen(str)))
{
*(temp ) = str[from ];
}
*temp = '\0';
printf("%s\n", between); // prints the extracted substring
return between; // returns the extracted substring
}
附錄
添加到問題中的替代示例正是我推測您可能使用的形式。在這種情況下,對呼叫者的指標副本的(非)影響與在執行問題中提出的第一個函式期間觀察到的函式引數的修改不相似,甚至不相關。
uj5u.com熱心網友回復:
增加指標后,它現在指向不同的記憶體區域。由于指標是 char 型別,所以加一個單位與加 sizeof(char) 個單位相同,結果仍然是 1;如您所說,要“倒帶”它,您只需要減去 16 * sizeof(char) = 16 (請注意,您正在取消參考由 16 求和的指標,因此減去 16 以將其恢復到它的位置,或減去你想要的多次,以便它指向你期望的位置)
uj5u.com熱心網友回復:
在此宣告之后
*between = '\0';
指標between指向一個空字串。所以這個呼叫printf:
printf("%s\n", between); // print nothing
確實不會輸出任何東西。
而這個回傳宣告
return (between);// even on calling function the pointer still at end of string
將此指標回傳到空字串。
注意這個條件
(from >=0)
沒有意義,因為無符號型別的物件size_t不能為負。
也不清楚為什么使用幻數16
between = malloc(16);
和
printf("%s\n", between - 16); // print between but never had to do this before...
并且該函式不應輸出任何訊息。函式的呼叫者將決定是否輸出某些東西。
該函式可以通過以下方式宣告和定義
char * ft_between( const char *str, size_t from, size_t to )
{
char *between;
size_t n = ft_strlen( str );
if ( n < to ) to = n;
if ( to <= from )
{
between = calloc( 1, sizeof( char ) );
}
else
{
between = malloc( to - from 1 );
if ( between != NULL )
{
char *p = between;
while ( from != to ) *p = str[from ];
*p = '\0';
}
}
return between;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/523654.html
