Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中使用void函数更改数组?_C_Arrays_Pointers_Pass By Reference_Void - Fatal编程技术网

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

如何在C中使用void函数更改数组?,c,arrays,pointers,pass-by-reference,void,C,Arrays,Pointers,Pass By Reference,Void,几天前,我刚开始尝试学习C语言,我跟着K&R的书学习。我对编程并不完全陌生,但我会说我是个新手。到目前为止,我做得很好,但是我在数组操作方面遇到了很多麻烦。在本书的第2.8节中,它定义了一个名为“挤压”的函数,该函数接收字符数组和单个字符,并从数组中删除单个字符的所有实例。一开始我很困惑,因为这是一个空函数 #include <stdio.h> void squeeze(char s[], char c); int main(){ char s[] = "hello";

几天前,我刚开始尝试学习C语言,我跟着K&R的书学习。我对编程并不完全陌生,但我会说我是个新手。到目前为止,我做得很好,但是我在数组操作方面遇到了很多麻烦。在本书的第2.8节中,它定义了一个名为“挤压”的函数,该函数接收字符数组和单个字符,并从数组中删除单个字符的所有实例。一开始我很困惑,因为这是一个空函数

#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';

}
#include <stdio.h>

void squeeze(char [], 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];
  }
  s[j] = '\0';

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

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

我有理由相信这是因为我没有使用挤压函数更改数组s[]

功能原型正常:

void squeeze(char [], char c);
在这里解析数组是完全可以的,因为数组在函数参数的上下文中无论如何都会衰减为指针

但是,您的实现不正确:

必须提供参数s的名称 并且必须正确地附上if语句,否则++j;无论条件是否为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';
    }

您正在使用挤压函数更改阵列。但是挤压函数无法产生所需的输出,因为该函数存在实现问题

#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';

}
#include <stdio.h>

void squeeze(char [], 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];
  }
  s[j] = '\0';

}
++j不会被视为循环中的。如果要将++j添加到循环中。然后使用下面的代码

if (s[i] != c){
          s[j] = s[i];
          ++j; 
}

internet中的所有值都为false,您应该重新分配新变量

void squeeze(char s[],char c) {
printf("s=%s\n",s);
int i, j;
char new_s[20];
for (i = j = 0; s[i] != '\0'; i++)
{
    if (s[i] != c)
    {
        new_s[j] = s[i];
        j++; //这里加了一但是 s[j] 没有赋值,下一个循环时才赋值。。
        //而最后一次没有下一个循环,所以s[j] 还没有赋值
    }
}
printf("s=%s\n",new_s);

}

您发布的代码无法编译,因为s是压缩中未声明的标识符。请确保您发布的代码与我在自己的C程序中实现的代码完全一致,更改void squeezechar[],char C;要取消压缩字符*s,字符c;C不是Python—C不关心分组语句的缩进。如果要在If后面将多个语句分组在一起,请用大括号将它们括起来。或者学习使用后增量运算符。谢谢!我不敢相信我没有意识到错误是在if语句中。或者s[j++]=s[I];在if之后,不需要大括号,尽管有些人认为即使在不必要的时候也应该使用大括号。@JonathanLeffler是的,我喜欢s[j++]=s[I];也但不管发生什么,我还是更喜欢括号。。