簡體   English   中英

C代碼使用指針反轉字符串

[英]C code to reverse a string using pointer

#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 請某人幫助我理解錯誤並意識到我的錯誤。 謝謝

有很多問題:

  • 您永遠不會為strstrrev分配內存。 這就是它崩潰的原因。 寫入未初始化的指針會調用未定義的行為,通常會導致段錯誤。
  • 當您只需要使用fgets()時,便會使用帶有復雜轉換的scanf() fgets()
  • 您應該使用strlen()而不是循環查找字符串的結尾。
char *str,*strrev;

首先,您的char緩沖區從未初始化過。

http://www.cplusplus.com/reference/cstring/strlen/第二次使用strlen確定字符串len

問候

在@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個字節。

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

// 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++;
}
#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';
}

簡單的代碼

暫無
暫無

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

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