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

kam*_*mmy 0 c

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

char* remove_newline_char(char *str){
    for(int i = 0; i < str[i]; i++){
        if(str[i] == '\n'){
            str[i] = '\0';
        }
    }
    return str;
}
Run Code Online (Sandbox Code Playgroud)

Cli*_*ord 5

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

字符串索引是否小于该索引处的字符值?

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

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

    return str ;
}
Run Code Online (Sandbox Code Playgroud)

鉴于此处理特定于由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 ;
}
Run Code Online (Sandbox Code Playgroud)


Dar*_*deX 5

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

正如您所说不使用字符串函数,我不使用strlen()函数。

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

char* remove_newline_char(char *str){
    size_t len = 0;
    while (str[len])
        len++;
    if(len > 0 && str[len - 1] == '\n')
        str[len - 1] = 0;
    return str;
}
Run Code Online (Sandbox Code Playgroud)

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

char* remove_newline_char(char *str, size_t len){
    if(len > 0 && str[len - 1] == '\n')
        str[len - 1] = 0;
    return str;
}
Run Code Online (Sandbox Code Playgroud)