gpt4 book ai didi

无法在 C 中打印全部内容

转载 作者:太空宇宙 更新时间:2023-11-04 02:59:40 25 4
gpt4 key购买 nike

遇到了一个大问题。比方说,我有一个指向大字符串(~1500 个字符)的指针,我想打印它。我在结果中得到的只是该字符串的一部分。程序打印该部分后,它要求我换行。在我按下回车键后,程序会打印字符串的其余部分并终止。当我尝试在终端或 IDE 中运行我的程序时会发生这种情况。如果我尝试调试它,它会完美运行。我需要它在不终止程序的情况下打印整个字符串。所以,这是代码(代码中有很多错误):

#include<stdio.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netdb.h>
#include<string.h>

#define SOCKET int // Apibreziame sinonima 'int' tipui, kad butu
// unix ir WIN sistemoms bendras kodas dirbant
// su soketu deskriptoriais.
#define closesocket close // Apibreziame sinonima close () funkcijai
// closesocket (), kuris yra analogas Windows
// tipo sistemose. Tai del kodo suvienodinimo.
#define INVALID_SOCKET -1 // Apibreziame del kodo suvienodinimo, klaidos
#define SOCKET_ERROR -1 // situacijai nusakyti konstantas, kurios WINSOCK'o

#define MAX_CH 255
#define POP3_PORT 110
#define MAXLEN 1024

int main()
{
SOCKET socketE;
struct sockaddr_in servaddr;
struct hostent* h = NULL;

char* Packet = NULL;

Packet = (char*)malloc(MAX_CH);
memset(Packet, 0, sizeof(Packet));

printf("POP3 server: ");
gets(Packet);

/*******{
client connects to the mail server and other stuff
server sends greeting message
client receives greeting message
}*******/

if (!strstr(Packet,"+OK")) {
print_error(Packet);
}
else {
printf("%s", Packet);
int printedData = 0;
while (1) {
Packet = (char*)realloc(NULL, 1);
memset(Packet, 0, sizeof(Packet));
gets(Packet);
strcat(Packet, "\n");
if (SOCKET_ERROR == SendPacket(&socketE, Packet)) {
print_error("Error on sending data to mail server.\n");
}
memset(Packet, '\0', sizeof(Packet));
if (SOCKET_ERROR == ReceivePacket(&socketE, &Packet)) {
print_error("Error on receiving data from mail server.\n");
}
if (!strstr(Packet,"+OK")) {
fwrite(Packet, 1, strlen(Packet), stdout);
break;
}
printf("%s", Packet); //THIS IS WHERE THE PRINT PART COMES
}
}
close(socketE);
return 0;
}

好的,所以我发现这个 if 子句(我的意思是,即使这个 if 是假的)会阻止程序打印所有内容。如果我删除/评论它,我的程序就会正常工作。这是否可能导致所有问题?

if (!strstr(Packet,"+OK")) {
fwrite(Packet, 1, strlen(Packet), stdout);
break;
}

最佳答案

这个:

Packet = (char*)realloc(NULL, 1);
memset(Packet, 0, sizeof(Packet));

导致未定义的行为。它分配一个字节(你为什么要这样做?)然后清除 sizeof(Packet) 字节,这在当今大多数典型系统上是 4 或 8 字节。因此,它在分配的内存之外写入。请注意,sizeof 无法跟踪动态分配,因此整个模式都是错误的。

此外,请注意动态内存分配可能失败;在依赖返回的指针是否有效之前,您必须检查每次调用 realloc() 的返回值。如果为NULL,则无法访问。

此外,就像 malloc() 一样,please don't cast the return value of realloc()在 C 中。

关于无法在 C 中打印全部内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13487891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com