遇到了很大的问题。让我们说,我有一个指向大字符串(~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;
}
Okey,所以我发现这个if子句(我的意思是,即使这个if为假)也会阻止程序打印所有内容。如果我删除/评论它,我的程序正常工作。是否有可能导致所有这些问题?
if (!strstr(Packet,"+OK")) {
fwrite(Packet, 1, strlen(Packet), stdout);
break;
}
答案 0 :(得分:2)
此:
Packet = (char*)realloc(NULL, 1);
memset(Packet, 0, sizeof(Packet));
导致未定义的行为。它分配一个字节(你为什么要这样做?)然后清除sizeof(Packet)
个字节,这在今天大多数典型系统上都是4或8个字节。因此,它在分配的内存之外写入。请注意,sizeof
无法跟踪动态分配,因此整个模式都是错误的。
另外,请注意动态内存分配失败;在依赖返回的指针有效之前,必须检查每次调用realloc()
的返回值。如果是NULL
,则无法通过它进行访问。
此外,与C中的malloc()
,please don't cast the return value of realloc()
一样。
答案 1 :(得分:0)
尝试在printf
之后添加flush:
printf("%s", Packet);
fflush(stdout);
printf
使用stdout
,这是行缓冲的。因此,如果字符串末尾没有printf
,则'\n'
文本可以部分刷新(打印)。
在您的情况下,键入换行符时会刷新未刷新的文本。
答案 2 :(得分:0)
Stdout是行缓冲的,stdout流中的字符将被保存,直到输出换行符或从连接到终端设备的任何流中读取输入,或者流缓冲区已满。 所以你可以将'\ n'字符放在你的printf中,如printf(“%s \ n”,Packet);或者只是使用setbuf(stdout,NULL)禁用stdout缓冲;用于printf打印完整的字符串