[英]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
指向的字符數組中。 此賦值使指針g1
和g2
指向同一個字符串,該字符串指向作為參數傳遞給 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:為了便於閱讀和理解:
for
if
else
while
do...while
switch
case
default
via一個空行
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.