我的作业是编写一个 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') {
我将不胜感激任何帮助!
您的程序在
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 ****