C 循环仅在指针赋值时执行一次
我有一个简单的代码来反转字符串:C 循环仅在指针赋值时执行一次,c,C,我有一个简单的代码来反转字符串: char* reverse(char* s){ int i,j,len=strlen(s); char* r; for(i=len-1,j=0;i>=0;i--,j++){ printf("%d:%c\n",j,s[i]); r[j]=s[i]; } 假设输入字符串为“abc”,则输出“不”行r[j]=s[i]内部循环是: 0:c 1:b 2:a 如果我包括r[j]=s[I]赋值,输出将停止 0:c 为什么分配会在这里停止
char* reverse(char* s){
int i,j,len=strlen(s);
char* r;
for(i=len-1,j=0;i>=0;i--,j++){
printf("%d:%c\n",j,s[i]);
r[j]=s[i];
}
假设输入字符串为“abc”,则输出“不”行r[j]=s[i]代码>内部循环是:
0:c
1:b
2:a
如果我包括r[j]=s[I]
赋值,输出将停止
0:c
为什么分配会在这里停止循环 首先,您正在写入未初始化的指针:char*r已声明,但从未分配。动态或在堆栈上分配内存,然后写入。
例如:
char* r = malloc(len + 1);
现在,当您试图访问未初始化的内存时,您的代码很可能会崩溃。首先,您正在写入未初始化的指针:char*r已声明,但从未分配。动态或在堆栈上分配内存,然后写入。
例如:
char* r = malloc(len + 1);
现在,当您试图访问未初始化的内存时,您的代码很可能会崩溃。有一些事情会导致问题
j被指定为零,并与for循环中的零进行比较,for循环将立即满足循环的条件并退出
还请注意,由于数组包含0作为第一个元素,因此字符串长度将报告为比实际大小小1,因此大小始终比数组中的大小小1
我建议将j从for循环赋值中拉出来,并在循环体中增加它。这将更容易调试,您可以监视它的值并逐步完成代码
// an example of how to assign the input value for a
// function accepting an array of characters instead of a pointer
char s[] ="hellodude";
// start of the function which accepts an array of char
// (may need adjusting to return a buffer and pointer
// etc. you can determine that)
char* reverse(char s[]){
// note the following changes to fix the iterating problems...
int i,j=0,len=strlen(s)+1;
char r[len];
for(i=len-1,i>=0;i--;){
j++;
printf("%d:%c\n",j,s[i]);
r[j]=s[i];
}
return r;
}
希望这能为您指明正确的方向。有些事情会导致问题
j被指定为零,并与for循环中的零进行比较,for循环将立即满足循环的条件并退出
还请注意,由于数组包含0作为第一个元素,因此字符串长度将报告为比实际大小小1,因此大小始终比数组中的大小小1
我建议将j从for循环赋值中拉出来,并在循环体中增加它。这将更容易调试,您可以监视它的值并逐步完成代码
// an example of how to assign the input value for a
// function accepting an array of characters instead of a pointer
char s[] ="hellodude";
// start of the function which accepts an array of char
// (may need adjusting to return a buffer and pointer
// etc. you can determine that)
char* reverse(char s[]){
// note the following changes to fix the iterating problems...
int i,j=0,len=strlen(s)+1;
char r[len];
for(i=len-1,i>=0;i--;){
j++;
printf("%d:%c\n",j,s[i]);
r[j]=s[i];
}
return r;
}
希望这能为您指明正确的方向。运行调试器。或者想想看。char*r代码>你认为r
指向哪里?运行调试器。或者想想看。char*r代码>你认为r
指向哪里?正如我所说的,分配内存。如果你被限制为c,那么做char*r=(char*)malloc(len+1);完成后别忘了释放它。正如我说的,分配内存。如果你被限制为c,那么做char*r=(char*)malloc(len+1);完成后别忘了释放它。