c - 以下程序中用于字符串比较的段错误

标签 c string pointers buffer-overflow strcmp

我遇到以下代码的段错误。程序的逻辑是它应该接受正确的密码( "abcd" )并且如果输入任何其他密码它应该拒绝访问,但是我输入错误的密码后仍然出现段错误(例如:"acdc""ancgff" )。我得到正确的对 "abc""xyz" 等密码的响应,我收到“拒绝访问”消息。

请帮助我,无法理解为什么会出现此错误?

#include <stdio.h>
#include <string.h>        

int check(char *password)
{
    char pin_buffer[4];

    int authority = 0;

    strcpy(pin_buffer,password);

    if(strcmp(pin_buffer,"abcd")==0)

        authority=1;
    return authority;

}

int main(int argc, char *argv[])
{   
    if(argc < 1)
    {           
        printf(argv[0]);
        exit(0);
    }

    if(check(argv[1]))
    {
       printf("access granted");
    } 
    else
    {
        printf("access denied};
}

最佳答案

你来定义

char pin_buf[4];

使用预先确定的 4 大小,然后在不进行任何检查的情况下使用

 strcpy(pin_buf,pin);

pin 有超过 3 个元素(和终止空值)时,您将在尝试复制时超出已分配内存的边界,这会导致 undefined behavior .

这就是为什么,你观察

"...I am still getting a segmentation fault after I enter wrong password (eg: "acdc" or "ancgff").I get proper response for passwords like "abc" or "xyz""

就是说,您根本不需要 pin_buf。您打算执行的操作可以通过 pin 本身来完成。

关于c - 以下程序中用于字符串比较的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43110051/

相关文章:

c - 我的 open() 命令没有创建新文件

c - 在 Linux 终端中执行 C 程序

r - 值名称作为赋值函数中的字符串

c - 是(char *)NULL-(char *)NULL未定义行为吗?

const char **a = {"string1","string2"} 和指针算术

c - 如何从 scanf 中识别字段分隔符?

c - 如何从 PNG 文件中读取任意 block ?

C++如何在字符串中使用变量

c - 如何读取两个文本文件并计算关键字数量?

c - 使用指针扫描指针数组