我的代码如下:
#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个以上的元素。 请帮助,因为我需要为我正在进行的项目修复此问题。 感谢。
答案 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);
您要求printf
将char
类型变量z[1].ID
打印为char*
格式的字符数组%s
)。这种格式可以打印每个字符,直到达到空字符\0
。
因此,它显示字符串,但它也与内存中的内容连接。实际上,struct
中包含的变量在内存中连接在一起。在您的情况下,z[1].ID
与z[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)
以下提议的代码:
现在是代码:
#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.