如何在C中使用void函数更改数组?
几天前,我刚开始尝试学习C语言,我跟着K&R的书学习。我对编程并不完全陌生,但我会说我是个新手。到目前为止,我做得很好,但是我在数组操作方面遇到了很多麻烦。在本书的第2.8节中,它定义了一个名为“挤压”的函数,该函数接收字符数组和单个字符,并从数组中删除单个字符的所有实例。一开始我很困惑,因为这是一个空函数如何在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";
#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];也但不管发生什么,我还是更喜欢括号。。