gpt4 book ai didi

C 去除字符串中的特殊字符

转载 作者:太空宇宙 更新时间:2023-11-04 00:28:02 25 4
gpt4 key购买 nike

我是 C 的新手,我创建了一个从字符串中删除特殊字符并返回新字符串(没有特殊字符)的函数。

乍一看,这似乎运行良好,我现在需要在一个(巨大的)文本文件(100 万个句子)的行上运行这个函数。在几千行/句子(大约 4,000)之后我遇到了段错误。

我在 C 中的内存分配和字符串方面没有太多经验,我试图找出我的代码的问题所在,不幸的是没有任何运气。这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

char *preproccessString(char *str) {
// Create a new string of the size of the input string, so this might be bigger than needed but should never be too small
char *result = malloc(sizeof(str));
// Array of allowed chars with a 0 on the end to know when the end of the array is reached, I don't know if there is a more elegant way to do this
// Changed from array to string for sake of simplicity
char *allowedCharsArray = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
// Initalize two integers
// i will be increased for every char in the string
int i = 0;
// j will be increased every time a new char is added to the result
int j = 0;
// Loop over the input string
while (str[i] != '\0') {
// l will be increased for every char in the allowed chars array
int l = 0;
// Loop over the chars in the allowed chars array
while (allowedCharsArray[l] != '\0') {
// If the char (From the input string) currently under consideration (index i) is present in the allowed chars array
if (allowedCharsArray[l] == toupper(str[i])) {
// Set char at index j of result string to uppercase version of char currently under consideration
result[j] = toupper(str[i]);
j++;
}
l++;
}
i++;
}
return result;
}

这是程序的其余部分,我认为问题可能出在这里。

int main(int argc, char *argv[]) {
char const * const fileName = argv[1];
FILE *file = fopen(fileName, "r");
char line[256];

while (fgets(line, sizeof(line), file)) {
printf("%s\n", preproccessString(line));
}

fclose(file);

return 0;
}

最佳答案

你有几个问题。

  1. 您没有分配足够的空间。 sizeof(str) 是指针的大小,而不是字符串的长度。你需要使用
char *result = malloc(strlen(str) + 1);

+ 1 用于终止空字节。

  1. 您没有向结果字符串添加终止空字节。添加
result[j] = '\0';

返回结果之前;

  1. 一旦您发现该字符与允许的字符相匹配,就无需继续循环遍历其余的允许字符。在j++之后添加break

  2. 您的 main() 函数永远不会释放 preprocessString() 的结果,因此您可能会耗尽内存。

    <
while (fgets(line, sizeof(line), file)) {
char *processed = preproccessString(line);
printf("%s\n", processed);
free(processed);
}

如果让调用者传入结果字符串而不是在函数中分配它,则可以解决其中的大部分问题。只需在 main() 函数中使用两个 char[256] 数组即可。

int main(int argc, char *argv[])
{
char const* const fileName = argv[1];
FILE* file = fopen(fileName, "r");
char line[256], processed[256];

while (fgets(line, sizeof(line), file)) {
processString(line, processed);
printf("%s\n", processed);
}

fclose(file);

return 0;
}

然后只需更改函数,使参数为:

void preprocessString(const char *str, char *result)

关于C 去除字符串中的特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56795761/

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