当我尝试运行这段代码时,它成功地向我请求一个字符串并将其分配给inpstr。当我调用deblank函数时,我得到“zsh bus error”任何帮助都将受到高度赞赏。
int main()
{
//Problem 1 Code
//Declare a string and assign user input to it with fgets and chomp it
char inpstr[20];
char outstr[20];
printf("Enter a string: ");
fgets(inpstr, 20, stdin);
chomp(inpstr);
//Call deblank to assign the copied string without whitespace to outstr
deblank(inpstr, outstr);
return 0;
}
void chomp(char word [])
{
if(word[strlen(word) - 1] == '\n')
{
word[strlen(word) - 1] = '\0';
}
}
void deblank(char *inpstr, char *outstr)
{
//First we find the length of the string not including the null
int length = strlen(inpstr);
//declare a counting variable
int o;
//For loop to check each letter
for(int i = 0; i < length; i++)
{
if(inpstr[i] != ' ')
{
outstr[o] = inpstr[i];
o++;
}
}
}
我尝试了几种不同的方法来重新定义指针,但没有任何改变。要么是编译错误,要么是另一个zsh总线错误。我已经删除了int length = strlen(inpstr)
的代码,并测试了它,它运行正常。我相信错误始于deblank
函数中的for循环。所有的函数原型都是在main函数上方输入的,库也包括在内。
2条答案
按热度按时间34gzjxbg1#
有几个问题。
首先,变量
o
没有初始化。所以用它作为索引
调用未定义的行为。
另一个问题是数组
outstr
将不包含字符串,因为您忘记将终止零字符'\0'附加到数组中存储的字符序列中。函数
deblank
可以用下面的方式定义。注意,你还应该删除制表符'\t'
。在函数中使用函数strlen
是低效的。函数可以更简单,不需要声明额外的变量。如果只想删除空格字符
' '
,则不需要头文件<ctype.h>
,函数中的if语句将如下所示最后是函数
chomp
也可以调用未定义的行为,如果一个空字符串将被传递给它,因为表达式
strlen(word) - 1
将产生一个大的正数。而不是使用您的手动编写的功能,你可以只写在主
iklwldmw2#
祝你好运