puts()无法打印空指针,而printf()可以?
下面这样一个程序,如果函数返回为NULL的话,用put打印:编译报错,提示:"Debug Assertion Failed!";而printf()去可打印出"(null)" 的字符样,这是什么原因?(请大家指点!)
#include<stdio.h>
#define N 80
char *str_chr(char * ,char);
int main()
{
char str[N];
while (gets(str) != NULL)
printf("%s\n",str_chr(str,'c')); // 它与puts(str_chr(str,'c'));的区别
}
char *str_chr(char *str,char c)
{
while (*str && *str != c)
str++;
if (*str == '\0')
return NULL;
else
return str;
}
[解决办法]
printf和puts在打印之前最好都要进行指针的判空处理,尤其是用%s打印的时候,printf在打印空指针的时候,编译器估计做了处理。。。
[解决办法]
最好不要依赖这种行为
对于可能的NULL要进行判断
[解决办法]
应该是puts()函数里参数不能为空。
[解决办法]
/****int puts(string) - put a string to stdout with newline**Purpose:* Write a string to stdout; don't include '\0' but append '\n'. Uses* temporary buffering for efficiency on stdout if unbuffered.**Entry:* char *string - string to output**Exit:* Good return = 0* Error return = EOF**Exceptions:********************************************************************************/int __cdecl _putts ( const _TCHAR *string ){ int buffing;#ifndef _UNICODE size_t length; size_t ndone;#endif /* _UNICODE */ int retval = _TEOF; /* error */ _VALIDATE_RETURN( (string != NULL), EINVAL, _TEOF );#ifndef _UNICODE _VALIDATE_STREAM_ANSI_RETURN(stdout, EINVAL, EOF);#endif /* _UNICODE */ _lock_str2(1, stdout); __try { buffing = _stbuf(stdout);#ifdef _UNICODE while (*string) { if (_putwchar_nolock(*string++) == WEOF) goto done; } if (_putwchar_nolock(L'\n') != WEOF) retval = 0; /* success */#else /* _UNICODE */ length = strlen(string); ndone = _fwrite_nolock(string,1,length,stdout); if (ndone == length) { _putc_nolock('\n',stdout); retval = 0; /* success */ }#endif /* _UNICODE */#ifdef _UNICODEdone:#endif /* _UNICODE */ _ftbuf(buffing, stdout); } __finally { _unlock_str2(1, stdout); } return retval;}
[解决办法]
在puts里面有下面这样的判定:
_VALIDATE_RETURN( (string != NULL), EINVAL, _TEOF );
在puts(str_chr(str,'c'));之前,可以先判断一下str_chr(str,'c')的返回值是否为NULL,如果是NULL,就puts("NULL");或者直接return。