我正在创建一个removeNonAlphaCharacters
函数,试图使用C删除所有非字母字符。
我可以删除函数中的所有非字母字符,但我不能将修改后的字符串传递回原始字符串,这意味着即使使用双指针,我也不能直接在函数中覆盖原始字符串。有谁知道我的代码出了什么问题吗?main
函数中的最后一个printf
不会为我打印HelloData,但是removeNonAlphaCharacters
函数中的printf
可以给予我正确的输出。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int removeNonAlphaCharacters(char ** source);
int main() {
char * source = "Hello 2 Data!";
char **sourcePointer = &source;
int result = 0;
result = removeNonAlphaCharacters(sourcePointer);
printf("we have successfully removed %i characters from the string.\n", result);
printf("The modified result is: %s", source);
return 0;
}
int removeNonAlphaCharacters(char ** source) {
char *dest = *source;
size_t sourceLength = strnlen(*source, 100);
char *str = malloc(sourceLength*sizeof(char));
int removeNum = 0;
for (; *dest != '\0'; dest++) {
if (*dest >= 'A' && *dest <= 'Z' || *dest >= 'a' && *dest <= 'z') {
*str = *dest;
str++;
}
else {
removeNum++;
continue;
}
}
printf("The modified result is: %s\n", str-(sourceLength-removeNum));
*source = malloc((sourceLength-removeNum) * sizeof(char));
strncpy(*source, str, 100);
return removeNum;
我尝试使用malloc
在函数中分配内存,但它不适合我。我还尝试直接覆盖removeNonAlphaCharacters
函数中的原始字符串,而不分配内存,这将导致内存错误SIGBUS
。
1条答案
按热度按时间wbrvyc0a1#
您遇到的问题在您的函数
removeNonAlphaCharacters
中。创建一个新的字符串
str
(即一个指向char的指针),当你操作这个字符串时,你的指针是递增的(在str++
行),因此当你调用函数strncpy
时,你复制的字符串是一个指向你想要的字符串结尾的指针(而不是指向开始的指针)。要修复,请将包含
strncpy
的行修改为不要忘记考虑将null终止符
'\0'
添加到新字符串中。