簡體   English   中英

卡在 c 中的指針交換循環中

[英]Stucking in the pointer swap loop in c

我現在正在嘗試學習 C 並且有一個示例不允許我使用string.h或其他功能。

例如,我需要用指針反轉字符串。

但是當我交換時,它卡住了。

#include <stdio.h>

void reverseCopy( char *, char *, int);

int main(){
    char *word1 = "Welcome to the C programming";
    char word2[50];
    int i,count;

    for(i=0;i<50;i++){
        if(word1[i]=='\0') break;
        count++;
    }

    reverseCopy(word1,word2,count);

    return 0;
}

void reverseCopy( char * g1, char * g2 ,int lenght){
    g2=g1;
    char temp;
    int i;
    int j=temp-1;

    for(i=0;i<j/2;i++){
        temp=*(g2+i);
        *(g2+i)=*(g2+j-i);
        *(g2+j-i)=temp;
    }

    puts(g2);
}

這樣一個字符串 function 以相反的順序將字符串復制到字符數組中應該只有兩個參數:目標字符數組和源字符串。 假設目標字符數組足夠大以容納源字符串。

至於你的 function reverseCopy定義然后甚至是 function 的第一條語句

g2=g1;

使 function 毫無意義,因為在此語句之后目標字符數組的地址丟失了。

正如您顯然認為的那樣,此分配不會將g1指向的字符串復制到g2指向的字符數組中。 此賦值使指針g1g2指向同一個字符串,該字符串指向作為參數傳遞給 function 的字符串文字。

現在,在此分配之后,您正試圖反轉導致未定義行為的字符串文字。

此外,您正在使用未初始化的變量,例如

char temp;
//...
int j=temp-1;

如果 function 應僅使用指針編寫,則不應使用 integer 變量i扮演索引的角色。

並且 function 不應該是 output 任何東西。 function 的調用者將決定是否對 output 進行任何處理。

下面是一個演示程序,顯示了如何僅使用指針來實現 function。

#include <stdio.h>

char * reverseCopy( char *s1, const char *s2 )
{
    const char *last = s2;

    while ( *last ) ++ last;

    char *first = s1;

    while ( last != s2 )
    {
        *first++ = *--last;
    }

    *first = '\0';

    return s1;
}

int main(void) 
{
    char *s1 = "Welcome to the C programming";
    char s2[50];

    puts( s1 );
    puts( reverseCopy( s2, s1 ) );

    return 0;
}

程序 output 是

Welcome to the C programming
gnimmargorp C eht ot emocleW

我認為您遇到了int j = temp-1而 temp 是 char 的問題 bcs, g2=g1的分配也給您帶來了問題

我可以建議你以下一個:

void reverseCopy( char * g1, char * g2 ,int lenght){
int i;
for(i=0;i<=lenght;i++){
    g2[i]=*(g1+lenght-i);
}
puts(g2);
}
}

主要的:

int main(){
char *word1 = "Welcome to the C programming";
char word2[50];
int i,count;
for(i=0;i<50;i++){
    if(word1[i]=='\0') break;
    count++;
}

reverseCopy(word1,word2,count);

return 0;

}

Output:

gnimmargorp C eht ot emocleW

發布的代碼在通過編譯器運行時會導致:

gcc   -O1  -ggdb -Wall -Wextra -Wconversion -pedantic -std=gnu11  -c "untitled2.c"  -I. (in directory: /home/richard/Documents/forum)

untitled2.c: In function ‘reverseCopy’:

untitled2.c:15:45: warning: unused parameter ‘lenght’ [-Wunused-parameter]
 void reverseCopy( char * g1, char * g2 ,int lenght){
                                         ^~~~~~

untitled2.c:19:15: warning: ‘temp’ is used uninitialized in this function [-Wuninitialized]
 int j=temp-1;
       ~~~~^~

untitled2.c: In function ‘main’:

untitled2.c:9:14: warning: ‘count’ is used uninitialized in this function [-Wuninitialized]
     count++;
     ~~~~~^~

Compilation finished successfully.

訪問/使用未初始化的變量是未定義的行為。

這個說法:

Compilation finished successfully.

只是意味着編譯器為這些問題產生了一些“解決方法”。 這並不意味着生成的代碼會執行您所期望的。

編譯時,啟用警告,然后修復這些警告。 編譯器中的上述 output 顯示了我用於gcc的選項。 其他編譯器使用不同的選項來產生相同的結果

發布的代碼尚未准備好鏈接。

解決問題,然后再聯系我們。

OT:為了便於閱讀和理解:

  1. 使用適當的空格:括號內、大括號內、方括號內、逗號后、分號后、C 運算符周圍。
  2. 單獨的代碼塊: for if else while do...while switch case default via一個空行
  3. 用 2 或 3 個空行分隔函數(保持一致)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM