此代码存储整数变量中的单词数,而多维数字符串中的单词则使用函数按字母顺序对单词进行排序。我遇到的问题是函数调用。
#include<stdio.h>
#include<string.h>
void sort(char*[50],int);
int main ()
{
int i,n=0;
char s[50][10];
scanf("%d",&n);//scaning the number of words
for(i=0;i<=n;i++)//scaning the words
gets(s[i]);
sort(s,n);
for(i=0;i<=n;i++)//printing the words sorted
printf("%s\n",s[i]);
}
void sort(char*s[50],int n)
{
int i,j,cmp;
char tmp[1][10];
//bubble sorting of words
for(i=0; i<n; i++)
for(j=0; j<n-1; j++)
{
cmp=strcmp(s[j],s[j+1]);
if(cmp>0)
{
strcpy(tmp[0],s[j+1]);
strcpy(s[j+1],s[j]);
strcpy(s[j],tmp[0]);
}
}
}
答案 0 :(得分:3)
打开警告。 char s[50][50]
无法转换为char*
。
试试这个:
void sort(char(*)[50],int);
这告诉编译器传入指向至少一个50个字符的缓冲区的指针。 这是多维数组在传递给函数时衰减的内容。
为了进一步摆脱“char[]
与char*
相同”的愚蠢观念,由于某种原因,它仍在各地教授,请阅读:http://c-faq.com/aryptr/aryptr2.html
答案 1 :(得分:1)
你很亲密。这是您的代码的工作版本。请注意,scanf()
会从... fgets()
的号码中删除换行符,因为您不会再使用gets()
,是吗? ...所以你需要在scanf()
之后阅读并包括换行符。当然,有一个有趣的问题是“为什么人们认为人类计算比计算机数更好呢?”如果不打扰计数会更明智。请注意,修订后的代码会验证n
以确保其不大于50。
#include <assert.h>
#include <stdio.h>
#include <string.h>
void sort(char s[50][10], int);
int main(void)
{
int i;
int n = 0;
char s[50][10];
char line[11];
if (scanf("%d", &n) != 1)
{
fprintf(stderr, "Failed to read a number\n");
return 1;
}
if (n <= 0 || n > 50)
{
fprintf(stderr, "%d is out of the range 1..50\n", n);
return 1;
}
// Gobble rest of first line
while ((i = getchar()) != EOF && i != '\n')
;
for (i = 0; i < n; i++)
{
if (fgets(line, sizeof(line), stdin) == 0)
break;
// Remove newline from input
size_t len = strlen(line);
assert(len > 0 && len <= sizeof(s[i]));
line[len-1] = '\0';
strcpy(s[i], line);
}
n = i; // In case the file was shorter than stated!
printf("Before:\n");
for (i = 0; i < n; i++)
printf("%s\n", s[i]);
sort(s, n);
printf("After:\n");
for (i = 0; i < n; i++)
printf("%s\n", s[i]);
return 0;
}
void sort(char s[50][10], int n)
{
int i, j, cmp;
char tmp[10];
if (n <= 1)
return; // Already sorted
for (i = 0; i < n; i++)
{
for (j = 0; j < n-1; j++)
{
cmp = strcmp(s[j], s[j+1]);
if (cmp > 0)
{
strcpy(tmp, s[j+1]);
strcpy(s[j+1], s[j]);
strcpy(s[j], tmp);
}
}
}
}
此代码将行读入字符串足够长的时间,最多可占用9个数据字符,换行符和终结符号null。它删除换行符,最多留下9个数据字符和一个终结符。
示例运行:
Before:
Number 34
Number 39
Number 32
Number 30
Number 22
Number 34
Number 57
Number 28
Number 30
Number 47
Number 43
Number 23
Number 22
After:
Number 22
Number 22
Number 23
Number 28
Number 30
Number 30
Number 32
Number 34
Number 34
Number 39
Number 43
Number 47
Number 57
#include <assert.h>
#include <stdio.h>
#include <string.h>
void sort(char s[50][10], int);
int main(void)
{
int i;
int n = 0;
char s[50][10];
if (scanf("%d", &n) != 1)
{
fprintf(stderr, "Failed to read a number\n");
return 1;
}
if (n <= 0 || n > 50)
{
fprintf(stderr, "%d is out of the range 1..50\n", n);
return 1;
}
// Gobble rest of first line
while ((i = getchar()) != EOF && i != '\n')
;
for (i = 0; i < n; i++)
{
if (fgets(s[i], sizeof(s[i]), stdin) == 0)
break;
// Remove newline from input
size_t len = strlen(s[i]);
assert(len > 0);
s[i][len-1] = '\0';
}
n = i; // In case the file was shorter than stated!
printf("Before:\n");
for (i = 0; i < n; i++)
printf("%s\n", s[i]);
sort(s, n);
printf("After:\n");
for (i = 0; i < n; i++)
printf("%s\n", s[i]);
return 0;
}
void sort(char s[50][10], int n)
{
int i, j, cmp;
char tmp[10];
if (n <= 1)
return; // Already sorted
for (i = 0; i < n; i++)
{
for (j = 0; j < n-1; j++)
{
cmp = strcmp(s[j], s[j+1]);
if (cmp > 0)
{
strcpy(tmp, s[j+1]);
strcpy(s[j+1], s[j]);
strcpy(s[j], tmp);
}
}
}
}
'big'更改是声明和定义函数数组参数的方式。您传递的是50行的数组,每行10个字符,因此只需在函数中指定。你可以从函数参数的维度中删除50而不改变程序的行为。
示例输入:
8
fed
abc
cba
def
hij
cba
xyz
aaa
示例运行:
$ ./srt < data
Before:
fed
abc
cba
def
hij
cba
xyz
aaa
After:
aaa
abc
cba
cba
def
fed
hij
xyz
$
需要修改这一事实表明了测试限制的重要性(并仔细定义了限制)。
修订后的代码仍然不是通用代码。最多50行输入的固定限制,作为输入一部分所需的行数,以及每行最多10个字符的固定行长度都使其成为玩具代码。因此,GIGO(垃圾进,垃圾出)不是不合理的反应。如果数据文件包含超长行,则可以获得所获得的内容。代码不会崩溃,但输出可能没什么意义。
答案 2 :(得分:0)
变化
void sort(char*[50],int);
...
void sort(char*s[50],int n)
到
void sort(char(*)[10],int);//not char(*)[50]
...
void sort(char(*s)[10],int n)
和
//remain newline
scanf("%d",&n);
到
scanf("%d%*c",&n);//read and drop newline
所以改变
for(i=0;i<=n;i++)
到
for(i=0;i<n;i++)
或
char *p[50];
for(i=0;i<n;++i)
p[i]=&s[i][0];
sort(p,n);//OK only exchange of pointer in this case