gpt4 book ai didi

计算文件中的行字母但排除特殊字符

转载 作者:行者123 更新时间:2023-11-30 17:06:12 24 4
gpt4 key购买 nike

我的程序可以计算字母,但计算得不好。它应该计算文件中每一行的字母数量。源代码:

FILE *fp;
int i,
counter; // Liczba liter w wiadomosci
setlocale(LC_ALL, "pl_PL.UTF-8");

while(run)
{
fp = fopen(FIFO, "r");
fwide(fp, 1);
while ((line = fgetws(buffer, sizeof buffer / sizeof buffer[0], fp)) != NULL)
{
counter = 0;
for (i = 0; line[i] != L'\0'; i++)
if (iswalpha(line[i]))
counter++;

printf("Amount of letters: %d", counter);
}

fclose(fp);
}

当文件中存在特定符号行“\0”末尾时,它无法正确计数。例如,如果文件我得到了一行:qwerty\00 azerty,它只返回 6 而不是 12。我该如何修复它?

最佳答案

使用read(3)(或fread(3))将结果读入缓冲区:

size_t nread = fread(buffer, sizeof(buffer) / sizeof(*buffer), sizeof(*buffer), fp);

然后,假设您想要逐行数字:

for (wchar_t *bp = buffer, *ep = buffer + nread; bp < ep; bp++) {
/* look for end-of-line character */
wchar_t *eol = wmemchr(bp, L'\n', ep - bp);
size_t n;

if (eol == NULL) {
/* now what? count the characters till the end of the buffer? */
...
}

/* the subarray from BP to EOL is one line, do the counting */
n = count(bp, eol - bp);
printf("Amount of letters: %zu\n", n);

/* set bp to eol for the next iteration */
bp = eol;
}

所有计数代码现在位于:

size_t count(const wchar_t *line, size_t ncharacters)
{
size_t counter = 0;

for (size_t i = 0; i < ncharacters; i++) {
if (iswalpha(line[i])) {
counter++;
}
}
return counter;
}

当然,此代码缺乏错误检查,例如当 eol 为 NULL 时,因为缓冲区中没有任何换行符。此外,您可能必须循环 fread(3) 位,因为 fread(3) 返回的项目可能少于缓冲区所能容纳的项目,例如,由于非阻塞 I/O 或者仅仅因为目前没有更多可用字符。

关于计算文件中的行字母但排除特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34848228/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com