c - 无法理解以下代码中的 scanf() 行为

标签 c arrays printf scanf

输入-

COMETQ
HVNGAT

这是代码-

#include <stdio.h>
#include <stdlib.h>

#define MAXLEN 6

main(void)
{
    char comet[MAXLEN], group[MAXLEN];
    unsigned long int result[2] = { 1,1 };
    short int i, j;

    scanf("%s",comet);
    scanf("%s",group);
    printf("\nComet's Name: %s\nGroup's Name: %s",comet,group);
    printf("\nComet's No.: %ld\nGroup's No.: %ld",result[0],result[1]);

    i = j = 0;
    while(comet[i]!='\0' && i<MAXLEN){
        result[0] *= (comet[i] - 'A' + 1);
        i++;
    }
    while(group[j]!='\0' && j<MAXLEN){
        result[1] *= (comet[j] - 'A' + 1);
        j++;
    }

    printf("\nComet's No.: %ld\nGroup's No.: %ld",result[0],result[1]);
    printf("\nComet's No. Mod 47: %ld\nGroup's No. Mod 47: %ld",result[0]%47,result[1]%47);

    if(result[0]%47 == result[1]%47)
        printf("\nGO");
    else
        printf("\nSTAY");

    exit(0);
}

现在,据我所知,scanf() 读取字符串直到检测到空格。但是在这里,输出是-

Comet's Name: COMETQHVNGAT
Group's Name: HVNGAT
Comet's No.: 1
Group's No.: 1
Comet's No.: -534663680
Group's No.: 994500
Comet's No. Mod 47: 43
Group's No. Mod 47: 27
STAY

但是,不应该是这样吗?

comet = "COMETQ" & Group = "HVNGAT"

我不明白为什么没有发生这种情况?

另外,当comet的大小为6字节时,如何存储-COMETQHVNGAT

最佳答案

如果您想将 char 数组用作字符串,则需要以 null 终止它。

在您的代码中,数组长度指定为 6,而您的输入本身是 6 字节,没有空间来存储终止空字符。这就是为什么当 cometgroup 被传递给 printf() 时,它们会产生奇怪的输出。

一个字符串是空终止的,基于这个原则,你的情况下的内存访问将超过 cometgroup 的分配内存大小,产生 undefined behaviour .

更安全的选择:

使用fgets()读取输入,受缓冲区大小限制,去掉最后一个\n字符,就可以了-去。查看 man page 了解详情。

此外,对于 unsigned long int,您需要将格式说明符 %ld 更改为 %lu%ld 用于signed long int

关于c - 无法理解以下代码中的 scanf() 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27499476/

相关文章:

c++ - 如何在 printf 中显示我的源代码的行号

c++ - 在 C 项目中使用 C++ 文件

c - 在替换文本之前使用 # 时不正确地终止宏调用

c++ - 如何使用带有右值引用参数的初始化程序//为什么不能用另一个 C 样式数组变量初始化 C 样式数组

c++ - 将一个类传递给 sprintf

c - 使指针指向另一个 C 程序

php - 计算平面文件中的唯一值并将它们更新为数组

java - 比较 2d int 数组与字符的最佳方法?

c - 什么是 "\t%.10g\n"

c - printf 和 long double