无法解决C程序中的分段错误

问题描述 投票:0回答:1

我的作业是编写一个 C 函数 void censor(char *start) ,它将用 **** 替换 start 指向的字符串中的所有 4 个字母单词。假设单词由空白字符分隔。这 字符串的开头和结尾也是分隔符。我不会在你的代码中使用 [ ] 。 例如下面的代码:

int main(){
char myStr[50] = ”this is a test for the last word in line”;
censor(myStr);
printf(”%s\n”, myStr);
}
would yield:
**** is a **** for the **** **** in ****

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* findBlank(char *start)
{   char *tempStart = start;
    while(*tempStart != '\0') {
        if(*tempStart == ' ') {
            return tempStart;
        }
        tempStart++;
    }
    return NULL;
}

void fourStars(char *start)
{
    char *tempStart = start;
    for (int i = 0; i < 4; ++i) {
        *tempStart = '*';
        tempStart++;
    }
}

void censor(char *start)
{   
    char *temp;

    while(*start != '\0') {
        int len = 0;
        temp = findBlank(start);
        while(start < temp && *start != '\0'){
            len++;
            start++;
        }

        if(len == 4) {
            char *replace = temp - len;
            fourStars(replace);
        }
        
        if ((*start != '\0') || (*(temp+1) != '\0')) {
            start = temp + 1;
        }
    }
}

int main()
{   
    char myStr[50] = "this is a test for the last word in line";
    censor(myStr);
    printf("%s\n", myStr);

}

我尝试通过 gdb 调试器运行它,并尝试跟踪它,但我无法解决这个问题。 这是 gdb 调试器的输出:

Program received signal SIGSEGV, Segmentation fault.
0x000055555555527c in censor (start=0x1 <error: Cannot access memory at address 0x1>) at main.c:29
29          while(*start != '\0') {

我将不胜感激任何帮助!

c pointers
1个回答
0
投票

您的程序在

while(*start != '\0')
上出现段错误,如
start == 1
,该值是通过
start = temp + 1
分配的,因此
temp == NULL
。当
temp
找不到任何空格时,
findBlank()
为 NULL。如果您想要审查最后 4 个字母单词,那么最小的修复方法是
findBlank()
返回指向“ ”的指针:

char *findBlank(char *start) {
    for(; *start; start++)
        if(*start == ' ')
            break;
    return start;
}

现在运行示例:

**** is a **** for the **** **** in ****
© www.soinside.com 2019 - 2024. All rights reserved.