在C编程中,为什么strcmp有时会在输入字符串的末尾添加一个字符?

在C编程中,为什么strcmp有时会在输入字符串的末尾添加一个字符?,c,C,在C编程中使用Code::blocks编写家庭作业,用于制作具有添加、删除、排序和搜索功能的学生列表,我编写了一个基于学生代码搜索学生的函数,如下所示: void search_student(struct student students[],int n) { char temp_code[11]; int row = 0; printf("Please enter the student code to search: "); scanf ("%s", tem

在C编程中使用Code::blocks编写家庭作业,用于制作具有添加、删除、排序和搜索功能的学生列表,我编写了一个基于学生代码搜索学生的函数,如下所示:

void search_student(struct student students[],int n)
{
    char temp_code[11];
    int row = 0;
    printf("Please enter the student code to search: ");
    scanf ("%s", temp_code);
    printf("\n#\tFirst_Name\tLast_Name\tStudent_Code\tAverage\n");
    puts("------------------------------------------------------------------");
    for (int i = 0 ; i < n ; i++)
    {
        printf("temp code= %s  --- students[%d].first_name = %s\n", temp_code, i, students[i].student_code);
        if (strcmp(temp_code, students[i].student_code) == 0 )
        {
            printf("%d\t%s\t\t%s\t\t%s\t%f\n",
                i+1, students[i].first_name, students[i].last_named, students[i].student_code, students[i].average);
            row = i + 1;
        }
    }
    if (row == 0)
    {
        puts("\nThe Student Code does not exist!\n");
    }
}
似乎在第一个循环之后,strcmp在temp_代码的末尾添加了一个字符,这会导致错误的输出

我发现操纵代码中不相关的部分可以解决这个问题!!(例如,在for循环中第二次printf后删除行=i+1) 当然,使用strncmp可以很好地工作!!
无论如何,我不明白strcmp为什么会这样

temp\u code
缓冲区不够大,无法读取字符串。这会导致程序具有未定义的行为。这就是为什么你会看到奇怪的无法解释的行为

sizeof(“student0002”)==12
,因为在C中字符串需要一个空终止字符


使
temp\u code
足够大,以便进行任何合理的输入。例如,
char temp_code[2048]
或研究防止缓冲区溢出的解决方案,如:

temp\u code
缓冲区不够大,无法读取字符串。这会导致程序具有未定义的行为。这就是为什么你会看到奇怪的无法解释的行为

sizeof(“student0002”)==12
,因为在C中字符串需要一个空终止字符


使
temp\u code
足够大,以便进行任何合理的输入。例如,
char temp_code[2048]或寻找防止缓冲区溢出的解决方案,如下所示:

您的数组临时代码太短,无法存储11个字符的字符串。11的数组是的,但不是长度为11的字符串。不,
strcmp
并不神秘或不完整。C中的字符串需要一个终止0(NULL)字符。所以你需要12个字符来容纳长度为11的字符串。这意味着你在不应该在的地方写作。“幸运的是”,IIRC,您正在
内容中写入空字符,因为它跟随
临时代码
,并且是静态分配的。经验教训是——不要忽略数组或缓冲区大小。您宁愿
1000
字符太长,也不愿
1
字符太短。此外,您的“搜索学生代码”看起来只是转储
i=0;i
从列表中删除节点,而不遍历与学生代码匹配的完整列表——这是您想要的吗?您的数组临时代码太短,无法存储11个字符的字符串。11的数组是的,但不是长度为11的字符串。不,
strcmp
并不神秘或不完整。C中的字符串需要一个终止0(NULL)字符。所以你需要12个字符来容纳长度为11的字符串。这意味着你在不应该在的地方写作。“幸运的是”,IIRC,您正在
内容中写入空字符,因为它跟随
临时代码
,并且是静态分配的。经验教训是——不要忽略数组或缓冲区大小。您宁愿
1000
字符太长,也不愿
1
字符太短。此外,您的“搜索学生代码”看起来只是转储
i=0;i
从列表中删除节点,而不遍历与学生代码匹配的完整列表——这是您想要的吗?
Please enter the student code to search: student0002

#       First_Name      Last_Name       Student_Code    Average
------------------------------------------------------------------
temp code= student0002  --- students[0].student_code = student0001
temp code= student0002  --- students[1].student_code = student0002
temp code= student0002  --- students[2].student_code = student0003

The Student Code does not exist!