簡體   English   中英

C ++編程,從字符串讀取行

[英]C++ Programming, read line from string

我需要從字符串中逐行讀取。 我嘗試了以下代碼,但是當它們之間有空行時卻出現錯誤,並且找不到我在做什么。

void ReadAllLine(char *szCont)
{
    int rdl = 0; /* read length */
    int len = 0; /* total length */
    char szLine[512] = {};

    len = strlen(szCont);

    int tl = 0; /* temp len */
    while(rdl < len)
    {  
       sscanf(szCont + rdl, "%512s\r\n", szLine);
       rdl += strlen(szLine) + 1;
       printf("%s\n", szLine);
    }  
    return 0;
}

輸入:

#Tag01
ENTRY01
ENTRY02

#Tag02
ENTRY11
ENTRY22

#Tag03
ENTRY31
ENTRY32

輸出:

#Tag01
ENTRY01
ENTRY02
#Tag02
ENTRY11
ENTRY22
#Tag03
3
ENTRY31
ENTRY32

為什么在這里打印3個?

注意:每行以Windows表示法(\\ r \\ n)終止,並且在任何一行之前或之后都沒有空格鍵。 從文件中讀取輸入,並將其傳遞給此函數。

下面是使您的代碼最小化以重現該問題的方法

#include <cstdio>
#include <cstring>

void ReadAllLine(const char *szCont)
{
    int rdl = 0; /* read length */
    int len = 0; /* total length */
    char szLine[512] = {};

    len = strlen(szCont);

    while(rdl < len)
    {
       sscanf(szCont + rdl, "%s", szLine);
       rdl += strlen(szLine) + 1;
       printf("%s\n", szLine);
    }
}

int main()
{
    const char *str ="\n\n#Tag02";
    ReadAllLine(str);
    return 0;
}

此打印

#Tag02
2

原因很簡單。 sscanf忽略空白字符,直到找到非空白字符以將其壓入輸出字符串為止。 因此,當您調用sscanf(szCont + 0, "%s", szLine); 第一次,它跳過第一次出現的2 \\n ,然后繼續將#Tag02推入szLine 現在,因為strlen("#Tag02") = 6的值rdl = 0 + 7 這意味着szCont + rdl現在將指向2 ,它將在下一次迭代中顯示。

您的情況也會發生相同的問題; 您的輸入有2次\\n\\n ,一次是在ENTRY02之后,然后是在ENTRY22之后。

您將回車符(\\ r)和換行符(\\ n)都視為行分隔符,這可能因操作系統而異(例如Windows,Unix等),因此請小心,否則代碼看起來還可以。 除非您在輸入前一行時有一些空格,否則不應將“ 3”作為單獨的行出現。 另一種選擇是在printf語句之前使用fflush,如下所示:

fflush(stdout);
printf("%s\n", szLine);

暫無
暫無

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

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