簡體   English   中英

無法在 C 中打印全部內容

[英]Can't print whole content in C

遇到了很大的問題。 假設我有一個指向大字符串(~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()請不要在 C中轉換realloc()的返回值

嘗試在printf之后添加 flush :

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

printf使用stdout ,它是行緩沖的。 因此,如果字符串末尾沒有'\\n' ,則可以部分刷新(打印) printf文本。

在您的情況下,當您鍵入換行符時,未刷新的文本會被刷新。

標准輸出是行緩沖的,標准輸出流中的字符將被保存,直到輸出換行符或從連接到終端設備的任何流中讀取輸入,或者如果流緩沖區已滿。 所以你可以把 '\\n' 字符放在你的 printf 中,比如 printf("%s\\n",Packet); 或者只是使用 setbuf(stdout, NULL) 禁用標准輸出緩沖; printf 打印完整的字符串

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM