gpt4 book ai didi

c - 在 C 中删除标点符号和大写

转载 作者:太空狗 更新时间:2023-10-29 17:10:32 25 4
gpt4 key购买 nike

我正在为学校编写一个程序,要求从文件中读取文本,将所有内容大写,并删除标点符号和空格。文件“Congress.txt”包含

(Congress shall make no law respecting an establishment of religion, or prohibiting the free exercise thereof; or abridging the freedom of speech, or of the press; or the right of the people peaceably to assemble, and to petition the government for a redress of grievances.)

它读入正确,但到目前为止我删除标点符号、空格和大写字母会导致垃圾字符出现一些重大问题。到目前为止我的代码是:

void processFile(char line[]) {
FILE *fp;
int i = 0;
char c;

if (!(fp = fopen("congress.txt", "r"))) {
printf("File could not be opened for input.\n");
exit(1);
}

line[i] = '\0';
fseek(fp, 0, SEEK_END);
fseek(fp, 0, SEEK_SET);
for (i = 0; i < MAX; ++i) {
fscanf(fp, "%c", &line[i]);
if (line[i] == ' ')
i++;
else if (ispunct((unsigned char)line[i]))
i++;
else if (islower((unsigned char)line[i])) {
line[i] = toupper((unsigned char)line[i]);
i++;
}
printf("%c", line[i]);
fprintf(csis, "%c", line[i]);
}

fclose(fp);
}

我不知道这是否是个问题,但我将 MAX 定义为 272,因为这是包含标点符号和空格的文本文件。

我得到的输出是:

    C╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠Press any key to continue . . .

最佳答案

基本算法需要遵循:

while next character is not EOF
if it is alphabetic
save the upper case version of it in the string
null terminate the string

转换为 C 为:

int c;
int i = 0;

while ((c = getc(fp)) != EOF)
{
if (isalpha(c))
line[i++] = toupper(c);
}
line[i] = '\0';

此代码不需要 (unsigned char)使用 <ctype.h> 中的函数进行转换因为c保证包含 EOF(在这种情况下它不会进入循环体)或转换为 unsigned char 的字符值反正。使用 char c 时,您只需要担心类型转换(如问题中的代码)并尝试编写 toupper(c)isalpha(c) .问题是普通 char可以是有符号类型,因此一些字符,众所周知的 ÿ(y-umlaut、U+00FF、带分音符的拉丁文小写字母 Y)将显示为负值,这违反了对 <ctype.h> 的输入要求职能。此代码将尝试对已经大写的字符进行大小写转换,但这可能比第二次测试成本更低。

您在打印等方面的其他操作由您决定。 csis文件流是一个全局范围变量;这有点(tricky)。您可能应该用换行符终止输出打印。

显示的代码容易受到缓冲区溢出的影响。如果line的长度是MAX ,那么你可以修改循环条件为:

while (i < MAX - 1 && (c = getc(fp)) != EOF)

如果为了更好的设计,您将函数签名更改为:

void processFile(int size, char line[]) {

并断言大小是严格正的:

    assert(size > 0);

然后循环条件变为:

while (i < size - 1 && (c = getc(fp)) != EOF)

显然,您也更改了调用:

char line[4096];

processFile(sizeof(line), line);

关于c - 在 C 中删除标点符号和大写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29736258/

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