2014-01-08 34 views
-1
#include <stdio.h> 

main() 
{ 
    char* str; 
    char* strrev; 
    int i = 0; 
    int j = 0; 
    int c; 

    printf("Enter the string\n"); 
    scanf("%[^\n]%*c", str); 

    while (*(str + i) != '\n') 
    { 
     i++; 
    } 

    for (c = i; c >= 0; c--) 
    { 
     *(strrev + j) = *(str + c); 
     j++; 
    } 
} 

這是我的代碼來反轉字符串。當我編譯代碼時,它會給出錯誤segmentation fault。有人plz幫助我瞭解錯誤,並意識到我的錯誤。 感謝使用指針反轉字符串的C代碼

+0

學會格式代碼,這有利於防止錯誤。 –

+0

還學習調試,這將幫助您找到重新修復的錯誤。 – usr2564301

回答

5

有許多問題:

  • 你從不爲strstrrev分配內存。這就是它崩潰的原因。寫入未初始化的指針會調用未定義的行爲,通常會導致seg錯誤。
  • 如果您只是使用fgets(),則您正在使用scanf(),並進行復雜的轉換。
  • 您應該使用strlen()而不是循環查找字符串的結尾。
0

關注中(部分)@unwinds指針,這裏是一些代碼,將扭轉的字符串:
(你可以使用scanf(),但不需要這樣複雜的格式字符串)

#include<stdio.h> 
main() 
{ 
    char str[260],strrev[260]; 
    int i=0, len; 
    printf("Enter the string\n"); 
    scanf("%s",str); 
    len = strlen(str); 
    for(i=1;i<len;i++) 
    { 
     strrev[i-1] = str[len-i]; 
    } 
    strrev[len]=0; 
    ; 
} 

如果你想避免使用scanf,然後用一些東西像:

char str[260], strrev[260]; 
//... 
fgets(buf, sizeof(str), stdin); 

[編輯-根據註釋]如果仍想使用char *,做這樣的事情:

#include<stdio.h> 
main() 
{ 
    char *str, *strrev; 
    int i=0, len; 
    printf("Enter the string\n"); 
    str = malloc(260); 
    strrev = malloc(260); 
    scanf("%s",str); 
    len = strlen(str); 
    for(i=1;i<len;i++) 
    { 
     strrev[i-1] = str[len-i]; 
    } 
    strrev[len]=0; 
    free(str); 
    free(strrev); 
} 

注意:除了按鍵計數,我不知道如何在運行時確定用戶將輸入多少個字符。所以在這個例子中,假設有260個字節。

+0

@ ryyker-謝謝!但是,我怎樣才能使用字符指針呢?而且我也不想使用內置功能。 – Ritesh

+0

我假設你說你不想使用_strlen()_,因爲你已經使用了一些內置函數(即_scanf()_和_printf()_)。但是,如果你真的想要使用char *,那麼需要內存分配,爲此,_malloc()_或_calloc()_將在某些時候需要(更多內置函數)。您是否允許明確設置最大字符串長度,還是必須在運行時確定它? – ryyker

0

除了@unwind,即使您使用了str[100],查找長度的循環也會失敗。由於str doens沒有\n,所以while()循環永不結束。

// bad 
char str[100]; 
scanf("%[^\n]%*c", str); 
while (*(str + i) != '\n') { 
    i++; 
} 

// better 
char str[100]; 
scanf("%99[^\n]%*c", str); 
while (*(str + i) != '\0') { // look for \0 
    i++; 
} 
0
#include<stdio.h> 
void main() 
{ 
    void mystrrev(char *); 
    char str[100]; 
    char *p1; 
    p1=str; 
    printf("Enter the string..?\n"); 
    scanf("%s",str); 
    mystrrev(p1); 
    printf("Reverse is =%s",p1); 

} 
void mystrrev(char *p1) 
{ 

    char rev[100]; 
    char *r; 
    r=rev; 
    int i=-1,j=0; 
    while(*p1!='\0') 
    { 
     p1++; 
     i++; 
    } 
    while(i>=0) 
    { 
     p1--; 
     *r=*p1; 
     r++; 
     j++; 
     i--; 
    } 
    *p1='\0'; 
    *r='\0'; 
    while(j-1>=0) 
    { 
     r--; 
     j--; 
    } 

    while(*r!='\0') 
    { 
     *p1=*r; 
     p1++; 
     r++; 
    } 
    *p1='\0'; 
} 

簡單的代碼