Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在函数中打印指向字符数组的指针?_C_String_Pointers_Printf_Scanf - Fatal编程技术网

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

C 如何在函数中打印指向字符数组的指针?,c,string,pointers,printf,scanf,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); pr

我正在尝试用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);
    }
}
#包括
#包括
无效断言(字符*第一,字符*第二);
内部主(空){
字符优先[1000];
字符秒[1000];
printf(“输入第一个字符串:”);
scanf(“%s”,第一个);
printf(“输入第二个字符串:”);
扫描频率(“%s”,秒);
断言(*第一,*第二);
返回退出成功;
}
无效断言(字符*第一,字符*第二){
如果(第一个==第二个){
printf(“测试通过:这些字符串相同”);
}否则{
printf(“测试失败:预期为%s,但返回了%s”,第一个,第二个);
}
}
问题是assert中else语句中的printf。当我的代码到达那一行时,它就停止了。如何修复此问题?

错误:

  • assert
    可以由实现来定义,您可以使用外部链接自己定义它

    7.2诊断
    […]
    2 assert宏应作为宏而不是实际函数来实现。如果 宏定义被抑制,为了访问实际函数,行为未定义

  • 将长度不限的字符串读入固定长度缓冲区:缓冲区溢出:UB
    %999s
    用于999个字符和sentinel

  • 调用
    scanf
    时未检查错误,可能导致使用未初始化的缓冲区:可能未找到终止符:UB
  • 比较两个指针是否相等(因此字符串是否相等),而不是字符串是否相等。包括
    并使用

    if(!strcmp(first, second))
    
  • 其他意见:

  • 返回退出成功
    是多余的,
    main
    具有隐式
    返回0在C99之后的末尾。
    
    • 这使得包含是多余的
  • 在首次使用之前定义函数可以删除转发声明
  • 试试下面的方法

    #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;
    }
    
    #包括
    #包括
    无效字符串_断言(常量字符*第一,常量字符*第二)
    {
    if(strcmp(第一,第二)==0)
    {
    printf(“测试通过:这些字符串相同”);
    }
    其他的
    {
    printf(“测试失败:预期为%s,但返回了%s”,第一个,第二个);
    }
    }   
    内部主(空)
    {
    字符优先[1000];
    字符秒[1000];
    printf(“输入第一个字符串:”);
    scanf(“%s”,第一个);
    printf(“输入第二个字符串:”);
    扫描频率(“%s”,秒);
    字符串断言(第一、第二);
    返回0;
    }
    
    • 将数组发送到
      assert
      函数时,应该发送它的基址

    • 要比较C中的字符串,需要使用strcmp函数。如果两者相等,则返回
      0
      。 在代码中包含
      string.h
      ,以使用它


    您正在比较地址,而不是字符串本身使用
    strcmp()
    strncmp()
    。函数调用更改为
    assert(第一,第二)。和
    if(first==second){
    更改为
    if(strcmp(first,second)==0){
    您想要相同或相等的字符串吗?另外,定义
    断言
    是个坏主意,请查看
    assert.h
    。接下来,您在读取字符串时可能会出现缓冲区溢出,请将其限制为999+sentinel:
    %999s
    编译器没有向您发出有关此代码的警告吗?或者您是否忽略了它们?错误,可能是多个定义初始化:
    assert
    @重复数据消除程序错误。两种错误都不会发生。
    7.2诊断[…]2 assert宏应作为宏而不是实际函数实现。如果为了访问实际函数而抑制宏定义,则行为未定义。
    @Deduplicator噢,您正在编写。然后应重命名函数。