我有一个简单的代码来反转字符串:
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
为什么作业会在这里停止循环?
答案 0 :(得分:2)
首先,您要写入未初始化的指针:声明char * r,但从未分配。动态地或在堆栈上分配内存,然后写入内存。 例如:
char* r = malloc(len + 1);
现在,当您尝试访问未初始化的内存时,您的代码很可能会崩溃。
答案 1 :(得分:1)
有些事情导致问题......
j被赋值为零,并在for循环中与零进行比较,这将立即满足循环的条件,并将退出。
另请注意,由于数组包含0作为第一个元素,因此字符串长度将报告为比实际大小小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;
}
希望这能指出你正确的方向。