[英]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.