我刚刚学习了指针,并在教科书上试了一下这个程序,
“声明一个大小为8的char
类型的数组,要求用户输入一个字符串,然后分配给数组。开发一个用户定义的函数,以非递减的顺序对数组进行排序。在排序之前和之后打印数组主要功能。函数原型给出void arr_sort( char * cPtr)
“
我不清楚我犯了什么错误。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void print(char *a[]);
void arr_sort( char *a[]);
int main()
{
int i;
char *array[8];
printf("Please input a string with size 7:");
for(i=0;i<7;i++)
{
scanf("%s",array);
}
printf("the array before sorting is");
print(array);
arr_sort(array);
print(array);
return 0;
}
void arr_sort( char *a[])
{
int i,j;
char *temp;
for(i=0;i<7;i++)
{
for(j=0;j<7;j++)
{
if(strcmp(a[j],a[j+1])>0)
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
void print(char *a[])
{
int i;
for(i=0;i<7;i++)
{
printf("%s ",a[i]);
}
}
在C中快速“谷歌”进行冒泡排序会导致:
// where 'n' is the number of entries in the array
// where 'array' is declared as 'int array[n];
for ( int c = 0 ; c < ( n - 1 ); c++ )
{
for ( int d = 0 ; d < n - c - 1; d++ )
{
if ( array[d] > array[d+1] ) /* For decreasing order use < */
{
int temp = array[d];
array[d] = array[d+1];
array[d+1] = temp;
}
}
}
注意索引变量上限的限制。
在你的程序中,你将使用char
而不是int
用于temp
和array[]
的声明
请注意,string.h
头文件中不需要任何内容。
注意限制局部变量c
,d
和temp
的范围
您发布的问题的评论涵盖了发布代码中的问题,因此我不会在此重复所有问题。
for(i=0;i<7;i++) {
scanf("%s",array);
}
如果你想要8个长度为7的字符串,则不能将它们扫描到数组中。您的数组是一个指针数组,如下所示:
char *array[8];
这与此非常不同:
char array[8];
第一个是存储8个字符串指针的数组。第二个是存储8个字符的数组。如果你想存储一个字符串,你会这样做:
char array[8];
printf("Please input a string with size 7: ");
scanf("%s", array);
这可能是你现在习惯的。
因此,一个指针数组就像一个指向内存块的小箭头列表。您的数组本身不存储任何字符,这就是您无法直接扫描到它的原因。
int main(void) {
char *arr[8];
char new_word[8];
for(int i = 0; i < 8; i++) {
printf("Enter a new word of length 7: ");
scanf("%s", new_word);
arr[i] = malloc(strlen(new_word) + 1);
strcpy(arr[i], new_word);
}
for(int i = 0; i < 8; i++) {
printf("%s\n", arr[i]);
}
return 0;
}
该程序创建两个数组:指针数组(arr)和字符数组(new_word)。在循环中,您要求七个长度为7的字符串,这些字符串将扫描到字符数组中。使用malloc为该字符串留出新内存。然后,将字符串复制到第一个数组指针指向的内存块中。我们使用for循环增加数组索引,以便现在我们使用下一个指针,依此类推。
每次使用strcpy并将字符串复制出字符数组非常重要,否则最后,您将只有一个指向单个字符串new_word的指针数组。