数组中只有1个元素存储超过应有的数量

时间:2017-06-02 14:47:33

标签: c arrays struct

我的代码如下:

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

typedef struct{

    char ID[1];
    char Content[4];
}

int main(){

    DATA z[1];
    DATA t;
    int c1, c2;

    scanf("%c",z[1].ID);
    scanf("%s",z[1].Content);

    printf("\n");

    c1=strlen(z[1].ID);
    c2=strlen(z[1].Content);

    t=z[1];

    printf("t:\n");
    printf("%s\n",t.ID);
    printf("%s\n",t.Content);

    printf("\n");

    printf("z:\n");
    printf("%s\n",z[1].ID);
    printf("%s\n",z[1].Content);

    printf("\n");

    printf("Length of z's ID: %d.\n",c1);
    printf("Length of z's Content: %d.\n",c2);
}

这是我在执行时得到的:

8
3092

t:
83092
3092

z:
83092
3092

Length of z's ID: 5.
Length of z's Content: 4.

我不知道为什么ID只有1时才有1个以上的元素。 请帮助,因为我需要为我正在进行的项目修复此问题。 感谢。

3 个答案:

答案 0 :(得分:0)

我认为有几个问题。

首先,使用长度为1的z上的索引1.您应该使用索引0。

其次,您使用%s打印ID,该ID需要以空值终止的字符数组。您的角色ID不是以空值终止的,因此它读取的内容超出了您的预期(它继续在内容中)。请注意,内容实际上是以空值终止的,因为您使用的是%s而不是%c

尝试将printf("%s\n",t.ID);更改为printf("%c\n",t.ID);

编辑: 我监督你在长度为4的数组中存储5个字符(4个字符和空终止)。正如@David Bowling建议的那样,你应该使用%3s或至少更大的数组。 感谢@David Bowling指出这一点!

请注意,我仍未对此进行测试,因为您的示例代码仍无效。

答案 1 :(得分:0)

z[1].ID等于代码中的8。您的问题是如何打印您的价值观。

这里:     

printf("%s\n",z[1].ID);
printf("%s\n",z[1].Content);

您要求printfchar类型变量z[1].ID打印为char*格式的字符数组%s)。这种格式可以打印每个字符,直到达到空字符\0

因此,它显示字符串,但它也与内存中的内容连接。实际上,struct中包含的变量在内存中连接在一起。在您的情况下,z[1].IDz[1].Content连接。

为避免此问题,您必须更改printf z[1].ID %c DATA z[1];的格式。

请注意您如何使用数组scanf("%c",z[1].ID); scanf("%s",z[1].Content);

请记住,C中数组的可到达范围是[0; N-1]。

在您的代码中,您需要更改&#34;解除引用&#34;你的阵列。

这是一个例子:     

scanf("%c",z[0].ID);
scanf("%s",z[0].Content);

    

DATA z[1];

如果您的数组仍然是这样声明的:SELECT ID, Groupname, CONVERT(VARCHAR, TimeSub, 103) AS Date, RIGHT(CONVERT(CHAR(20), TimeSub, 22), 11) AS Time, TK, CProblem, Fix, Username, Closed_Date, Reason FROM dbo.log

答案 2 :(得分:0)

以下提议的代码:

  1. 干净地编译
  2. 更正评论中列出的问题
  3. 执行所需的功能
  4. 现在是代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct{
    
        char ID[1];
        char Content[4];
    } DATA;
    
    int main( void )
    {
        DATA z[1];
        DATA t;
        size_t c1;
        size_t c2;
    
        if( 1 != scanf("%c",  &(z[0].ID[0]) ) )
        {
            perror( "scanf for character failed" );
            exit( EXIT_FAILURE );
        }
    
        // implied else, scanf successful
    
        if( 1 != scanf("%3s",  z[0].Content) )
        {
            perror( "scanf for content string failed" );
            exit( EXIT_FAILURE );
        }
    
        // implied else, scanf successful
    
        printf("\n");
    
        c1=sizeof(z[0].ID);
        c2=strlen(z[0].Content);
    
        memcpy( &t, z, sizeof( t ) );
    
        printf("t: ID:%c Content:%s\n\n", t.ID[0], t.Content);
        printf("z: ID:%c Content:%s\n\n", z[0].ID[0], z[0].Content);
    
        printf("Length of z's ID: %lu.\n",c1);
        printf("Length of z's Content: %lu.\n",c2);
    }
    

    使用此输入运行建议的代码:

    a
    bcd
    

    或此输入:

    a bcd
    

    或此输入:

    abcd
    

    产生此输出:

    t: ID:a Content:bcd
    
    z: ID:a Content:bcd
    
    Length of z's ID: 1.
    Length of z's Content: 3.