我試圖通過一些CSV日誌文件解析只提取第n場(解僱其他人的速度)。當我使用fread大於輸入大小的緩衝區大小時,我的函數按預期工作。功能'保存進度'的問題
問題是當我讀入部分輸入並嘗試繼續下一次調用該函數時離開的位置。我相信問題在於我如何處理空終止符和設置我的全局變量,但我似乎無法弄清楚。
任何幫助理解我在做什麼錯誤非常感謝!
代碼
#include <stdio.h>
#include <time.h>
int gcomc = 0;
int gpos = 0;
void test(char *str, int len)
{
const char *ptr = str;
char ch;
int i;
char so[10];
int comc = gcomc;
int pos = gpos;
for(i = 0; i < len; i++)
{
ch = ptr[i];
switch(ch)
{
case ';':
comc++;
break;
case '\0':
gcomc = comc;
gpos = pos;
break;
default:
if (comc == 3) {
ch = ptr[i];
so[pos++] = ch;
}
if (comc == 7) {
printf(" %s ", so);
comc = 0;
pos = 0;
gcomc = 0;
gpos = 0;
}
}
}
return;
}
int main(int argc, char* argv[])
{
FILE *fin=fopen("test.txt", "rb");
char buffer[100 + 1];
size_t bsz;
while((bsz = fread(buffer, sizeof *buffer, 100, fin)) > 0)
{
buffer[bsz] = '\0';
test(buffer, bsz);
}
return 1;
}
輸入
A;B;C;D;E;F;G;H
I;J;K;L;M;N;O;P
Q;R;S;T;U;V;W;X
Y;Z;1;2;3;4;5;6
具有100(101)緩衝區大小
D L T 2
輸出用的10(11)緩衝區大小
D P
Q X
Segmentation fault (core dumped)
輸出
編輯: 謝謝你的意見和代碼,我返工我的(而啞寫的)代碼 - 任何進一步的批評是值得歡迎的(建設性或破壞性的,我從中學到所有):
#include <stdio.h>
#include <time.h>
void test(char *str, int len);
int gcomc, gpos = 0;
void test(char *str, int len)
{
const char *ptr = str;
char ch;
int i;
static char so[10];
for(i = 0; i < len; i++)
{
ch = ptr[i];
switch(ch)
{
case ';':
gcomc++;
break;
default:
if (gcomc == 3) {
ch = ptr[i];
so[gpos++] = ch;
}
if (gcomc == 7) {
so[gpos] = '\0'; /* ensure so is null terminated */
printf(" %s ", so);
gcomc = 0;
gpos = 0;
}
}
}
return;
}
extern int main()
{
FILE *fin=fopen("test.txt", "rb");
char buffer[10 + 1];
size_t bsz;
while((bsz = fread(buffer, sizeof *buffer, sizeof buffer, fin)) > 0)
{
test(buffer, bsz);
}
return 1;
}
爲什麼你甚至要將全局變量複製到當地人,反之亦然?爲什麼不直接使用全局變量,如果函數改變狀態(這通常不是最好的想法)。另外,它似乎也應該是一個全球性的(如果你在一個令牌中間讀到的話)? – Lou
我會說這種情況'case'\ 0':'永遠不會發生。 – alk
無法使用顯示的代碼重現UB。 – alk