C语言 无法操作作为指向函数内部指针的指针传递的字符串

qojgxg4l  于 2023-05-06  发布在  其他
关注(0)|答案(1)|浏览(149)

我正在创建一个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

wbrvyc0a

wbrvyc0a1#

您遇到的问题在您的函数removeNonAlphaCharacters中。
创建一个新的字符串str(即一个指向char的指针),当你操作这个字符串时,你的指针是递增的(在str++行),因此当你调用函数strncpy时,你复制的字符串是一个指向你想要的字符串结尾的指针(而不是指向开始的指针)。
要修复,请将包含strncpy的行修改为

strncpy(*source, str-(sourceLength-removeNum), 100);

不要忘记考虑将null终止符'\0'添加到新字符串中。

相关问题