函式 find_any 回傳一個指標,該指標指向陣列中任何成員的第一次出現,其第一個元素由指標 vals 指向,并且在半開值范圍內具有 len 個元素。如果沒有找到陣列 vals 的成員,則函式回傳 NULL。
這是我迄今為止撰寫的一組代碼,但它似乎不起作用。我已經有一個函式可以查找字串中是否出現單個字符,但我似乎無法讓它在更多字符之間進行檢查。我只需要使用指標,并且不允許有下標或任何包含指令。
char const* find_any(char const *begin, char const *end, char const *vals, int len){
int flag=0,i=0;
while(begin!=end){
while(i!=len){
if(*begin==*vals){
flag=1;
break;
}
vals ;
i ;
}
i=0;
begin ;
}
if(flag==1) return begin;
else return NULL;
uj5u.com熱心網友回復:
診斷
您的主要問題之一是您遞增vals,但您希望多次迭代同一個字串:對于第二個字符和第三個字符,以及......您需要復制valsfor 在回圈中使用。
您正在實作一個變體strpbrk()——不同之處在于您不是使用以空字符結尾的字串,而是使用“指標加長度/結束”位元組陣列。不能保證該值以空值結尾的事實vals意味著您不能使用strchr()并且沒有strnchar()標準可用的函式;否則,您可以使用函式呼叫代替內部回圈。
將兩個回圈都變成for回圈:for (int i = 0; i != len; i ). 當您撤消較早宣告的混亂和額外的i = 0;. 您應該使用return begin;而不是flag = 1; break;,這會讓您丟失flag變數和額外的測驗(NULL如果您退出外回圈,您只需回傳)。
您的另一個問題是,break只有在找到角色時才退出內部回圈,而您也想退出外部回圈。您可以使用goto陳述句和標簽,但這比return在函式中間使用 a 更糟糕。除非你的導師return在函式中間有一個規則,否則使用它。
固定代碼
#include <stddef.h>
char const *find_any(char const *begin, char const *end, char const *vals, int len)
{
for (const char *haystack = begin; haystack < end; haystack )
{
for (const char *needle = vals; needle < vals len; needle )
{
if (*haystack == *needle)
return haystack;
}
}
return NULL;
}
介面一致性
我注意到該介面使用兩種不同的方法來處理非空終止的位元組陣列:指向開始和(超過一個位置)結束的指標,以及指向開始和長度的指標。介面應該更一致——一致的代碼更容易使用。任何一種機制都是有效的,但在給定函式中只使用一種機制(并在一組函式中一致地使用它)。使用任一:
extern char const *find_any(char const *haystack, char const *h_end, char const *needle, const char *n_end);
或者:
extern char const *find_any(char const *haystack, size_t h_len, char const *needle, size_t n_len);
甚至:
extern char const *find_any(size_t h_len, char const haystack[h_len], size_t n_len, char const needle[n_len]);
size_t此外,使用尺寸/長度而不是int(盡管我確信有些人不同意)通常是一種很好的做法。至少,使用size_t意味著您不必擔心檢查負尺寸或長度。
測驗代碼
該函式被設為靜態以避免來自我的默認編譯器選項(源檔案ba59.c;程式ba59)的抱怨。如果函式要包含在庫中,則將有一個頭檔案來宣告該函式(以及其他函式),該函式將包含在實作的源代碼find_any()和使用該函式的任何代碼中。
gcc -O3 -g -std=c11 -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes -fno-common ba59.c -o ba59
代碼:
#include <stddef.h>
static char const *find_any(char const *begin, char const *end, char const *vals, int len)
{
for (const char *haystack = begin; haystack < end; haystack )
{
for (const char *needle = vals; needle < vals len; needle )
{
if (*haystack == *needle)
return haystack;
}
}
return NULL;
}
#include <stdio.h>
static void test_find_any(const char *src, const char *end, const char *vals, int vlen)
{
const char *rv = find_any(src, end, vals, vlen);
if (rv == NULL)
printf("No characters from [%.*s] were found in [%.*s]\n",
vlen, vals, (int)(end - src), src);
else
printf("Found character from [%.*s] at [%.*s]\n",
vlen, vals, (int)(end - rv), rv);
}
int main(void)
{
char haystack[] = "Conniptions";
char needle1[] = "ABXYZabxyz";
char needle2[] = "ion";
char needle3[] = "zap";
char *h_end = haystack sizeof(haystack) - 1;
int n1_len = sizeof(needle1) - 1;
int n2_len = sizeof(needle2) - 1;
int n3_len = sizeof(needle3) - 1;
test_find_any(haystack, h_end, needle1, n1_len);
test_find_any(haystack, h_end, needle2, n2_len);
test_find_any(haystack, h_end, needle3, n3_len);
return 0;
}
結果:
No characters from [ABXYZabxyz] were found in [Conniptions]
Found character from [ion] at [onniptions]
Found character from [zap] at [ptions]
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/524304.html
標籤:数组C指针
