我正试图在c中进行自己的简单测试。这是我的尝试:
#include <stdio.h>
#include <stdlib.h>
void assert(char *first, char *second);
int main(void) {
char first[1000];
char second[1000];
printf("Enter first string: ");
scanf("%s", first);
printf("Enter second string: ");
scanf("%s", second);
assert(*first, *second);
return EXIT_SUCCESS;
}
void assert(char *first, char *second){
if( first == second ){
printf("Test Passed: these strings are the same");
}else{
printf("Test Failed: expected %s but returned %s", first, second);
}
}
问题是assert中else语句中的printf。当我的代码到达那条线时它会刹车。我该如何解决这个问题?
答案 0 :(得分:1)
错误:
assert
可以由实现定义,使用外部链接自己定义Undefined Behavior (UB)。
7.2诊断
<assert.h>
[...]
2断言宏应实现为宏,而不是实际功能。如果 为了访问实际函数,宏定义被抑制,行为未定义
您将一段无限长度的字符串读入固定长度的缓冲区:缓冲区溢出: UB
使用%999s
代替999个字符加上sentinel
scanf
时未检查错误,可能导致使用未初始化的缓冲区:可能找不到终结符: UB 比较两个指针是否相等(因此字符串是相同的),而不是相等的字符串。包括<string.h>
并使用
if(!strcmp(first, second))
其他观察:
return EXIT_SUCCESS;
是多余的,自{C99}以来main
隐含return 0;
。
#include <stdlib.h>
变得多余。答案 1 :(得分:1)
当您将数组发送到assert
函数时,您应该发送它的基地址。就像这样:assert(first,second);
要比较C中的字符串,您需要使用strcmp函数。如果两者相等,则返回0
。
在您的代码中加入string.h
即可使用它。
答案 2 :(得分:0)
尝试以下
#include <stdio.h>
#include <string.h>
void string_assert( const char *first, const char *second )
{
if ( strcmp( first, second ) == 0 )
{
printf( "Test Passed: these strings are the same" );
}
else
{
printf( "Test Failed: expected %s but returned %s", first, second );
}
}
int main( void )
{
char first[1000];
char second[1000];
printf( "Enter first string: " );
scanf( "%s", first );
printf( "Enter second string: " );
scanf( "%s", second );
string_assert( first, second );
return 0;
}