Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.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 函数使数组为空_C - Fatal编程技术网

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:谢谢-很好-我现在更新了答案以涵盖这一点。