如何在函数内打印指向字符数组的指针?

时间:2014-09-14 07:51:22

标签: c string pointers printf scanf

我正试图在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。当我的代码到达那条线时它会刹车。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

错误:

  1. assert可以由实现定义,使用外部链接自己定义Undefined Behavior (UB)

      

    7.2诊断<assert.h>

         

    [...]
      2断言宏应实现为宏,而不是实际功能。如果   为了访问实际函数,宏定义被抑制,行为未定义

  2. 您将一段无限长度的字符串读入固定长度的缓冲区:缓冲区溢出: UB
    使用%999s代替999个字符加上sentinel

  3. 您在调用scanf时未检查错误,可能导致使用未初始化的缓冲区:可能找不到终结符: UB
  4. 比较两个指针是否相等(因此字符串是相同的),而不是相等的字符串。包括<string.h>并使用

    if(!strcmp(first, second))
    
  5. 其他观察:

    1. return EXIT_SUCCESS;是多余的,自{C99}以来main隐含return 0;
      • 这使#include <stdlib.h>变得多余。
    2. 首次使用前定义功能可以删除前向声明。

答案 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;
}