我的代码有什么问题?说分段错误

时间:2019-10-27 18:24:23

标签: c

我想做的是,从用户输入中获取消息并反转字符串。因此,我使用2个指针,一个指针指向消息数组的第一个元素,另一个指针指向最后一个元素。然后我进行交换,直到两个指针相遇。

#include <stdio.h>
#include <string.h>
void reverse(char* message);
    int main()
    {
        char message[100];

        printf("Enter a message: ");
        scanf("%s",message);
        printf("\nok");
        reverse(message);
        printf("ok \n");
        printf("%s",message);

        return 0;
    }

    void reverse(char* message){

        char* p = message;
        char* temp = message;
        char* q = (message + (strlen(message)); // pointing to the last element before 
                                             // null character

        printf("\ncoming");
        while( p != q){

                                  // why am I getting a segmentation fault? whats happening?
            *p = *q;
            *q = *temp;

            p++;
            q--;
            temp = p;  

        }// while loop
    }// reverse

4 个答案:

答案 0 :(得分:1)

此行

char* q = (message + (strlen(message));

它是否指向最后一个字符。

考虑一个字符的消息-strlen(message)将一个字符。但是第一个字符是char * q = message

因此该行应显示为

char* q = (message + strlen(message) - 1;

也可以交换

尝试

char temp;

然后代替

*p = *q; 
*q = *temp;
p++;
q--;
temp = p;  

使用

temp = *p;  // We got the temp
*p = *q;    // Old p is safe - it is now temp.
*q = temp;

p++;
q++;

使用此代码,不会反转空字符!因此,在正确的位置!

Finalluy,

while( p != q){

应该是

while( p < q){

答案 1 :(得分:0)

关于:

p++;
q--;

在上述语句之后,指针可以相互传递。然后循环一直运行到段为止。故障发生

答案 2 :(得分:0)

我修复了while循环条件。现在我给了while(p

两个指针ptemp都指向messagechar* p = message; char* temp = message;

在while循环中执行*p = *q;时,由“ p” 指向的字符和由“ temp”指向的字符被更新为“ q”处的字符(因为以上声明)。 下一行*q = *temp;实际上是将新更新的字符(“ * q”)复制回“ q”。

此外,如“ M Oehm”所指出的, message + strlen(message)指向NULL字符,而不是NULL之前的最后一个字符。

还请注意“ user3629249”发表的有关缺少括号的评论。

更正这些代码应该看起来像...

void reverse(char* message){

    char* p = message;
    char* temp = message;
    char* q = (message + strlen(message)-1); // pointing to the last element 
    char c; //to store the value of "temp"                          

    printf("\ncoming");
    while( p < q){

        c = *temp;              
        *p = *q;
        *q = c;

        p++;
        q--;
        temp = p;  

    }// while loop
}// reverse

话虽如此,由于“ C”按值传递参数,因此您可以实现相同的功能,如....

void reverse(char* message){

    char* q = (message + strlen(message)-1);
    char c;                                     
    while( message < q){
        c = *message;
        *message = *q;
        *q = c;
        message++;
        q--;
    }
}

答案 3 :(得分:-1)

segmentation fault是由试图读取或写入非法内存位置的程序引起的。对于p++q--而言,while (p != q)可以始终为真,例如,如果pq指向两个连续的字符。检查此方法是否可以反转字符串:

#include <string.h>

void reverse(char *str)
{
    //skip null string
    if (str == 0)
    {
        return;
    }

    // skip empty string
    if (*str == 0)
    {
        return;
    }

    // get range
    char *start = str;
    char *end = start + strlen(str) - 1; // -1 for the end \0
    char temp;

    // reverse 
    while (end > start)
    {
        // swap chars
        temp = *start;
        *start = *end;
        *end = temp;

        // move to next position
        ++start;
        --end;
    }
}


int main(void)
{
    char s1[] = "Stack Overflow is GREAT!";
    reverse(s1);
    printf("%s\n", s1);

    return 0;
}