C语言 我需要删除输入字符串中的所有空格,并将新字符串复制到deblank函数中的另一个字符串,

6fe3ivhb  于 2023-04-05  发布在  其他
关注(0)|答案(2)|浏览(147)

当我尝试运行这段代码时,它成功地向我请求一个字符串并将其分配给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函数上方输入的,库也包括在内。

34gzjxbg

34gzjxbg1#

有几个问题。
首先,变量o没有初始化。

int o;

所以用它作为索引

outstr[o] = inpstr[i];

调用未定义的行为。
另一个问题是数组outstr将不包含字符串,因为您忘记将终止零字符'\0'附加到数组中存储的字符序列中。
函数deblank可以用下面的方式定义。注意,你还应该删除制表符'\t'。在函数中使用函数strlen是低效的。函数可以更简单,不需要声明额外的变量。

#include <ctype.h>

//...

void deblank( const char *inpstr, char *outstr )
{
    do
    {
        if ( !isblank( ( unsigned char )*inpstr ) )
        {
            *outstr++ =  *inpstr;
        }
    } while ( *inpstr++ );
}

如果只想删除空格字符' ',则不需要头文件<ctype.h>,函数中的if语句将如下所示

if ( *inpstr != ' ' )

最后是函数chomp

void chomp(char word [])
{
    if(word[strlen(word) - 1] == '\n')
    {
        word[strlen(word) - 1] = '\0';
    }
}

也可以调用未定义的行为,如果一个空字符串将被传递给它,因为表达式strlen(word) - 1将产生一个大的正数。
而不是使用您的手动编写的功能,你可以只写在主

inpstr[ strcspn( inpstr, "\n" ) ] = '\0';
iklwldmw

iklwldmw2#

  • 初始化o
  • 将\0放在输出的末尾
  • 使用while与额外条件一起删除末尾的所有\n,' '
  • 添加了包含和转发以使其编译
#include <stdio.h>
#include <string.h>

// Add forwards
void chomp(char word []);
void deblank(char *inpstr, char *outstr);

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);

    printf("The outstr: (%s)\n", outstr);
    return 0;
}

void chomp(char word [])
{
    // remove all  \n or ' '
    // there should be some length
    while(strlen(word) > 0 && (word[strlen(word) - 1] == '\n' ||  word[strlen(word) - 1] == ' ' ) )
    {
        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=0;  // initialize it !!!

    //For loop to check each letter
    for(int i = 0; i < length; i++)
    {
        if(inpstr[i] != ' ')
        {
            outstr[o] = inpstr[i];
            o++;
        }
    }
    outstr[o]='\0';  // end the contructed with \0

}

祝你好运

相关问题