有没有办法从使用 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)
您的代码在语义上不正确。循环终止表达式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)
您不需要遍历整个数组并在每次迭代时检查每个字符。
正如您所说不使用字符串函数,我不使用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)