如何在不使用字符串函数的情况下删除 fgets 函数的 \n

How to remove \n of fgets function, without using string functions

有没有办法在不使用字符串处理函数(strlen、strtok、strcspn 等)的情况下,从使用 fgets 读取的字符串末尾删除 \N 字符? 我试过了,但没用

char* remove_newline_char(char *str){
    for(int i = 0; i < str[i]; i++){
        if(str[i] == '\n'){
            str[i] = '[=10=]';
        }
    }
    return str;
}

您的代码在语义上不正确。循环终止表达式 i < str[i] 表示:

is the string index less than the character value at that index?

这当然是无稽之谈 - 索引和字符值无关。

char* remove_newline_char(char* str)
{
    int i = 0 ;
    while( str[i] != 0 && str[i] != '\n' )
    {
        i++ ;
    }
    str[i] = 0 ;

    return str ;
}

鉴于此处理特定于由 fgets() 填充的缓冲区而不是通用字符串函数,将输入与处理结合起来可能会有好处,这样它就不会应用于不合适的字符串(即不是来自 fgets()):

char* freadline( char* str, int num, FILE* stream )
{
    char* ret = NULL ;

    if( (ret = fgets( str, num, str )) != NULL )
    {
        int i = 0 ;
        while( str[i] != 0 && str[i] != '\n' )
        {
            i++ ;
        }
        str[i] = 0 ;
     }
     return ret ;
}

您不需要遍历整个数组并在每次迭代时检查每个字符。

因为,你已经声明不要使用字符串函数,我不会使用strlen()函数。

fgets() 中,换行符出现在 length - 1 位置。

char* remove_newline_char(char *str){
    size_t len = 0;
    while (str[len])
        len++;
    if(str[len - 1] == '\n')
        str[len - 1] = 0;
    return str;
}

另外,如果你知道字符串的长度,那么你就可以避免while循环

char* remove_newline_char(char *str, size_t len){
    if(str[len - 1] == '\n')
        str[len - 1] = 0;
    return str;
}

我的循环当然是错误的。这是有效的版本

char* remove_newline_char(char *str){
for(int i = 0; str[i]; i++){
    if(str[i] == '\n'){
        str[i] = '[=10=]';
    }
}
return str;

}