[英]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
。 請某人幫助我理解錯誤並意識到我的錯誤。 謝謝
有很多問題:
str
或strrev
分配內存。 這就是它崩潰的原因。 寫入未初始化的指針會調用未定義的行為,通常會導致段錯誤。 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
沒有\\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++;
}
#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.