使用指针反转字符串的C代码

时间:2014-01-08 15:56:40

标签: c arrays pointers character

#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。有人帮助我理解错误并实现我的错误。 感谢

5 个答案:

答案 0 :(得分:5)

有很多问题:

  • 您永远不会为strstrrev分配内存。这就是崩溃的原因;写入未初始化的指针会调用未定义的行为,通常会导致seg错误。
  • 当您可以使用scanf()时,您正在使用fgets()进行复杂的转换。
  • 您应该使用strlen()而不是循环来查找字符串的结尾。

答案 1 :(得分:0)

char *str,*strrev;

首先你的char缓冲区从未初始化。

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

问候

答案 2 :(得分: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个字节。

答案 3 :(得分:0)

除了@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++;
}

答案 4 :(得分:0)

C1 = open("Class 1.txt", "a")
pos = C1.find(S_N)
C1.seek(pos)
C1.write(correct)

简单代码