gpt4 book ai didi

c - 如何在 C 中使用 void 函数更改数组?

转载 作者:太空宇宙 更新时间:2023-11-04 05:16:54 24 4
gpt4 key购买 nike

几天前,我刚开始尝试学习 C,方法是学习 K&R 书。我对编程并不陌生,但我会说我是新手。到目前为止,我大部分情况下都做得很好,但我在数组操作方面遇到了很多麻烦。在本书的 2.8 节中,它定义了一个名为 squeeze 的函数,该函数接受一个字符数组和一个字符,并从数组中删除单个字符的所有实例。起初我很困惑,因为这是一个 void 函数。

#include <stdio.h>

void squeeze(char s[], char c);

int main(){
char s[] = "hello";
squeeze(s, 'l');
printf("%s\n", s);
}

void squeeze(char s[], char c){
int i, j;

for (i = j = 0; s[i] != '\0'; i++){
if (s[i] != c)
s[j] = s[i];
++j;
}
s[j] = '\0';

}

我将它实现到我自己的 C 程序中,当我在 Main 中调用该函数时,它只打印我的原始数组而不改变它。我有理由相信这是因为在调用 printf 之前我没有使用 Squeeze 函数更改数组 s[],而是更改了未使用的数组副本。我已经研究过使用指针来引用 C 中的数组,但我仍然对如何正确地做到这一点感到很困惑,因为无论我尝试什么,我要么得到一个段错误,要么数组没有改变。谁能帮我理解指针和数组在这种情况下的工作原理?

编辑:我最初在函数原型(prototype)和声明中声明了参数的名称,但我在复制它时出错了。

最佳答案

I am reasonably sure that this is because I am not changing the array s[] with the Squeeze function

函数原型(prototype)没问题:

void squeeze(char [], char c);

在这里解析数组是完全可以的,因为在函数参数的上下文中数组无论如何都会衰减为指针。

不过,您的实现不正确:

  • 您必须提供参数名称 s
  • 并且必须正确地包含你的if语句,否则++j;将被执行无论条件是否if (s[i] != c ) 是否满足。

这是解决这两个问题的指南:

    void squeeze(char s[], char c){  // <-- 1) must provide parameter name
int i, j;

for (i = j = 0; s[i] != '\0'; i++){
if (s[i] != c)
{ // <-- 2) must enclose if statement properly
s[j] = s[i];
++j;
}
}
s[j] = '\0';
}

关于c - 如何在 C 中使用 void 函数更改数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41605269/

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