1

遇到了大问题。假设我有一个指向大字符串(约 1500 个字符)的指针,我想打印它。我在结果中得到的只是该字符串的一部分。在程序打印该部分后,它要求我换行。在我按下 enter 后,程序打印字符串的其余部分并终止。当我尝试在终端或 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;
}
4

3 回答 3

2

这:

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

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

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

此外,就像 with 一样malloc()请不要realloc()在 C中转换返回值。

于 2012-11-21T07:56:13.187 回答
0

尝试在之后添加冲洗printf

printf("%s", Packet);
fflush(stdout);

printfuse stdout,它是行缓冲的。因此,如果字符串末尾printf没有,则可以部分刷新(打印)文本。'\n'

在您的情况下,当您键入换行符时,未刷新的文本会被刷新。

于 2012-11-21T07:02:21.867 回答
0

标准输出是行缓冲的,标准输出流中的字符被保存,直到输出换行符或从连接到终端设备的任何流中读取输入,或者流缓冲区已满。因此,您可以将 '\n' 字符放入 printf 中,例如 printf("%s\n",Packet); 或者只是使用 setbuf(stdout, NULL) 禁用标准输出缓冲;用于 printf 打印完整的字符串

于 2012-11-21T11:18:44.210 回答