C 函数使数组为空
我有以下代码:C 函数使数组为空,c,C,我有以下代码: #include <stdio.h> void insertion_sort(char[], int); void swap(char*, char*); int main() { char s[] = "hello world"; puts(s); insertion_sort(s, sizeof(s)/sizeof(char)); puts("done\n"); puts(s); return 0; } voi
#include <stdio.h>
void insertion_sort(char[], int);
void swap(char*, char*);
int main() {
char s[] = "hello world";
puts(s);
insertion_sort(s, sizeof(s)/sizeof(char));
puts("done\n");
puts(s);
return 0;
}
void swap(char* a, char* b) {
char tmp = *a;
*a = *b;
*b = tmp;
}
void insertion_sort(char s[], int n)
{
int i,j;
/* counters */
for (i=1; i<n; i++) {
j=i;
while ((j>0) && (s[j] < s[j-1])) {
swap(&s[j],&s[j-1]);
j = j-1;
}
printf("%s\n", s);
}
}
#包括
无效插入排序(char[],int);
无效互换(字符*,字符*);
int main(){
char s[]=“你好,世界”;
卖出(s);
插入排序(s,sizeof(s)/sizeof(char));
卖出(“完成”\n);
卖出(s);
返回0;
}
无效交换(字符*a,字符*b){
char tmp=*a;
*a=*b;
*b=tmp;
}
无效插入\排序(字符s[],整数n)
{
int i,j;
/*计数器*/
对于(i=1;i0)和(s[j]
问题是,在调用insertion\u sort()
函数后,s
变为空-put(s)
不打印任何内容
请告知。更改:
insertion_sort(s, sizeof(s)/sizeof(char));
致:
否则,您将在排序中包含s[]
的'\0'
终止符
请注意,strlen
需要一个额外的标题,因此请更改:
#include <stdio.h>
#包括
致:
#包括//printf等
#包括//strlen等
更改:
insertion_sort(s, sizeof(s)/sizeof(char));
致:
否则,您将在排序中包含s[]
的'\0'
终止符
请注意,strlen
需要一个额外的标题,因此请更改:
#include <stdio.h>
#包括
致:
#包括//printf等
#包括//strlen等
问题在于传递给插入\u排序
的长度包括终止\0
字符,该字符恰好具有值0
,因此在排序中它被放置为数组的第一个元素。这就是为什么最后一个put()
不打印任何内容,因为第一个字符现在是“字符串的结尾”
我建议您使用
strlen()
计算字符串的大小,它将返回字符串的长度(不包括终止字符)。或者,如果您想按自己的方式执行,请考虑终止字符,并将其从总长度中减去。问题是,传递给插入\u排序的长度包括终止\0
字符,该字符恰好有值0
,因此,在排序中,它被放置为数组的第一个元素。这就是为什么最后一个put()
不打印任何内容,因为第一个字符现在是“字符串的结尾”
我建议您使用strlen()
计算字符串的大小,它将返回字符串的长度(不包括终止字符)。或者,如果您想按自己的方式执行,请考虑终止字符,并将其从总长度中减去。字符串的NUL终止符放在前面。这就是原因。调试不需要IDE,您可以直接使用gdb。然后使用命令行调试器。或者使用printf()
调试。虽然我建议先尝试gdb
。我尝试了调试,发现空终止字符“\0”放在字符串的开头。这导致put
无法打印任何内容。虽然我看不到put
中发生了什么,因为它是在c库中定义的,但我得到的信息足以理解这个问题。谢谢。字符串的NUL终止符放在前面。这就是原因。调试不需要IDE,您可以直接使用gdb。然后使用命令行调试器。或者使用printf()
调试。虽然我建议先尝试gdb
。我尝试了调试,发现空终止字符“\0”放在字符串的开头。这导致put
无法打印任何内容。虽然我看不到put
中发生了什么,因为它是在c库中定义的,但我得到的信息足以理解这个问题。谢谢。strlen位于string.h中,所以别忘了#include@Zekian:谢谢-好的观点-我现在更新了答案以涵盖这一点。strlen位于string.h中,所以别忘了#include@Zekian:谢谢-很好-我现在更新了答案以涵盖这一点。