我的代碼。 我想做的是輸入兩個字串,然后回傳最長的一個。如果它們的長度相同,則回傳NULL。現在,代碼只是輸出胡言亂語,我找不到原因。該函式回傳一個指向最大字串的第一個字符的指標。然后它經歷了 while 回圈,我試圖解除對該指標的參考并列印出其值。
注意:我正在為考試復習,我們必須只使用指標,而不是把字串當作陣列。
#include<stdio.h>
char* string_ln(char*, char*) ;
int main() {
char str1[20] 。
char str2[20] 。
char* length;
scanf("%s%s"/span>, str1, str2);
length = string_ln(str1, str2);
while (length != ' ') {
printf("%c"/span>, *length)。
length ;
}
}
char* string_ln(char*p1, char*p2) /span> {
int count1 = 0;
while (*p1 != ''/span>) {
count1 ;
p1 ;
}
int count2 = 0;
while (*p2 != ''/span>) {
count2 ;
p2 ;
}
if (count1 > count2) { count2 ; p2 ; }
return p1;
}
else if (count2 > count1) {
return p2;
}
else {
return NULL;
}
uj5u.com熱心網友回復:
在撰寫string_ln時,你完全迭代了兩個字串以找到它們的長度,然后比較這些數字。這可以作業,但你實際上不需要這樣做。你只需要知道哪個是長的。較長的字串有多長并不重要。
char *string_ln(char *str1, char *str2) {
char *iter1, *iter2;
for (iter1 = str1, iter2 = str2;
*iter1 && *iter2;
iter1 , iter2 )。)
if (! (*iter1 || *iter2)) {
return NULL。
}
else if (*iter1) {
return str1;
}
else {
return str2;
}
}
我們只需要在兩個字串上進行迭代,直到至少有一個字串碰到NULL字符。一旦我們到達這一點,我們可以測驗哪個迭代器是NULL。如果是這兩個,那么它們的長度是一樣的。如果第一個迭代器不是NULL,那么第一個字串就比較長。否則,第二個字串會更長。
這種方法的好處是,我們避免了不必要的作業,并使比較長度非常不同的字串變得更加快速。
uj5u.com熱心網友回復:
我認為你漏掉了對指標的解除參考。而不是
while(length!=' ')
你將需要
while(*length!=''/span>)
這就是說,在被呼叫的函式中,你在增量后獲得了指標,也就是說,回傳的指標不再指向字串的開始。你需要確保你回傳的指標是指向字串的開頭。你可以將你的代碼改為
int count1 = 0;
while (p1[count1] != ''/span>) {
count1 ;
}
int count2 = 0;
while (p2[count2] != ''/span>) {
count2 ;
}
這樣,p1和p2就不會改變。
uj5u.com熱心網友回復:
這里有幾個問題。首先,你在函式中修改了p1和p2,所以你實際上不會回傳一個指向最大字串開頭的指標,而是指向其結尾。避免這種情況的一種方法是在p1和p2的副本上進行迭代:
char* string_ln(char*p1, char*p2)。
{
char* tmp1 = p1;
int count1 = 0;
while (*tmp1 != ''/span>) {
count1 ;
tmp1 ;
}
char* tmp2 = p2;
int count2 = 0;
while (*tmp2 != ''/span>) {
count2 ;
tmp2 ;
}
if(count1> count2){
return p1;
}
else if(count2> count1){
return p2;
}
else{
return NULL;
}
第二,在你的main中,你使用了%c格式的字串,它適用于單個char,而不是整個字串。因為你反正有一個字串,所以你可以避免使用格式字串,而直接列印它。另外,請注意,你應該明確地檢查NULLs:
int main() {
char str1[20] 。
char str2[20] 。
char* longest;
scanf("%s%s"/span>, str1, str2);
longest = string_ln(str1, str2);
if (longest) {
printf(longest)。
} else {
printf("They are the same length")。
}
uj5u.com熱心網友回復:
對于初學者來說,這個函式應該像這樣宣告
char * string_ln( const *。const char * )。
因為傳遞的字串沒有在函式中被改變。
你正在從函式中回傳已經修改過的指標p1或p2,該指標正在其中一個while回圈中被改變
while (*p1 != '') {
count1 ;
p1 ;
}
while (*p2 != '') { count1 ; p1 ; }
count2 ;
p2 ;
}
所以回傳的指標指向一個字串的終止零點''。
此外,在這個while回圈之前的main中,
length = string_ln(str1, str2);
while(length!=''){ printf("%c", *length)。 length ; }
你沒有檢查指標length是否等于NULL。因此,該程式可以呼叫未定義的行為。
函式本身可以通過以下方式定義,只使用指標。
char * string_ln( const char *p1, const char *p2 )
{
const char *s1 = p1。
const char *s2 = p2。
while ( *s1 != ''/span> && *s2 != ''/span> )
{
s1;
s2;
}
if ( *s1 == *s2 )
{
return NULL;
}
else if ( *s1 == ' ' )
{
return ( char * )p2;
}
else char * )p2; }
{
return ( char * )p1;
}
}
而在main中你需要寫
char *length = string_ln( str1, str2 ) 。
if ( length != NULL )
{
while ( *length )
printf( "%c", *length ) 。
}
請注意,該函式的回傳型別是char *,而不是const char *。這是因為在C語言中沒有函式多載,回傳的指標可以指向一個常量字串或一個非常量字串。這是C語言中宣告字串函式的一個一般慣例。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/329587.html
標籤:
