我必須創建一個可以執行此任務的函式(修剪函式):取一個以空字符結尾的字串,如果在字串的第 0 個位置有一個空格,則洗掉該空格。如果空格位于字串的末尾(在零終止符之前),則相同。因此,基本上該函式會忽略字串中間的空格。
這是我到目前為止嘗試做的事情,(1)我將“ ab ”字串傳遞給修剪函式。(2)(空指標檢查)。(3) 我使用 strlen 函式獲取字串的長度。
(4)(這是微妙的部分,因為逐行除錯我發現for回圈內部有一個奇怪的錯誤)。
錯誤是這樣的:當除錯器運行 for 回圈的第一行時,它按預期進入回圈;好的,那很好,但是當除錯器運行 if 檢查時,它應該是真的(因為在字串的開頭有一個空格)并且函式應該在 if 主體中,在第一個 if 陳述句中,并重新分配記憶。但事實并非如此,因為 realloc 從未執行過。為什么?
(該函式必須回傳指向重新分配記憶體的指標)。
另一個錯誤是“s”未初始化,但我還是使用了它,這不是真的,因為我用“ab”字串初始化了 s。
char* trim(const char* s) {
if (s == NULL) {
return NULL;
}
size_t length = strlen(s);
for (unsigned int i = 0; s[i] != '\0'; i ) {
if (s[i] == " ") {
realloc(s, length - sizeof(char));
}
}
return s;
}
int main(void) {
trim(" a b ");
return 0;
}
uj5u.com熱心網友回復:
在 if 陳述句中,您試圖將 char 型別的物件s[i]與" "隱式的字串文字進行比較;ly 轉換為指向其第一個元素的指標。
if (s[i] == " ") {
很明顯,這樣的比較評估為邏輯錯誤。
您需要使用整數字符常量' '而不是字串文字。
if (s[i] == ' ') {
還有這個記憶體重新分配
realloc(s, length - sizeof(char));
沒有意義,因為至少重新分配的記憶體的地址沒有存盤在任何地方。
您不得觸摸源字串s。您需要動態分配一個新的字符陣列并將修剪后的源字串復制到那里。
例如,可以按以下方式定義該功能,如下面的演示程式所示。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
char * trim( const char *s )
{
const char *first = s;
while ( isblank( ( unsigned char )*first ) ) first;
const char *last = first strlen( first );
while ( last != first && isblank( ( unsigned char )last[-1] ) ) --last;
size_t n = last - first;
char * result = malloc( n 1 );
if ( result != NULL )
{
memcpy( result, first, n );
result[n] = '\0';
}
return result;
}
int main(void)
{
const char *s = " a b ";
printf( "\"%s\"\n", s );
char *p = trim( s );
printf( "\"%s\"\n", p );
free( p );
return 0;
}
程式輸出是
" a b "
"a b"
在函式內而不是這個 while 回圈
while ( isblank( ( unsigned char )*first ) ) first;
您可以將該功能strspn用作
first = strspn( first, " \t" );
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/368932.html
