我创建了一个程序,要求用户输入一个名称,如果他们选择选项2并将其存储在字符串中,如果用户选择选项3,那么它将显示该名称。现在对于选项4,它需要按顺序按字母顺序排列名称,因此当我再次选择选项3以查看名称时,它将按字母顺序显示它们。我的朋友告诉我使用strcpy(),我试过但不太成功。
这是我的代码:
//This is my code:
#include<stdio.h>
#include<string.h>
int main() {
int i = 0;
int j = 0;
while (1) {
int num;
char name[500][100],t[100];
printf("\nPress 1 to see author info\n");
printf("Press 2 to enter a name\n");
printf("Press 3 to view names\n");
printf("Press 4 to alphabatize names\n");
scanf("%d", &num);
char arr[100];
if (num == 1)
{
printf("----------------\n");
printf("name\n");
printf("132\n");
printf("----------------\n");
}
if (num == 2)
{
printf("Enter the name (no spaces)\n");
scanf("%s", arr);
strcpy(name[i], arr);
i++;
}
if (num == 3)
{
printf("\n******************************");
for (int j = 0; j<i; j++)
{
printf("\n%s\n", &name[j]);
}
printf("\n\n\n******************************");
}
if (num == 4)
{
for (i = 1; i < j; i++) {
for (j = 1; j < i; j++) {
if (strcmp(name[j - 1], name[j]) > 0) {
strcpy(t, name[j - 1]);
strcpy(name[j - 1], name[j]);
strcpy(name[j], t);
}
}
}
;
}
return(0)
system("pause");
}
答案 0 :(得分:0)
如果Barmar不想将评论作为答案:
如上所述:你在外圈中使用的i
是总数,你不能使用它,你需要一个新的,k
。按字母顺序排序:
int k;
if (num == 4) {
for (j = 0; j < i; j++) {
for (k = 0; k < i - j - 1; k++) {
if (strcmp(name[k], name[k + 1]) > 0) {
strcpy(t, name[k]);
strcpy(name[k], name[k+1]);
strcpy(name[k+1], t);
}
}
}
}
我使用了一种略微不同的冒泡方法,这就是我学习它的方法,希望你能理解它。
注意:复制完整的字符串并不是最好的方法,但我不知道你是否已经学过指针。
答案 1 :(得分:0)
修改了你的代码。看起来对于这种情况,开关盒会更漂亮,你的循环永远不会结束。有了@Barmar所说的,你的循环有db.collection.aggregate([
{
"$match": {
"$text": {
"$search": "search text"
}
}
},
{
"$project": {
"_id": 0,
"score": {
"$meta": "textScore"
}
}
},
{
"$orderby": {
"score" : -1
}
}
])
因此过早终止。我已经更改了代码的一些元素,因为其中一些元素适合不受干扰等等。
除了切换案例的实现
- char数组的名称和位置。对于t [100],由于它是一个临时对象/变量,我将其移动到
return 0;
(参见第63行) 在修改后的代码中),以便按需创建 早期创建的原始代码。将t重命名为temp。 至于arr,我已将其重命名为更清晰(nameIn表示 名称输入)
- num的名字为了更容易理解代码,我将其设置为nameCount,以指示名称的数量或大小。
- 重组循环,以便其计数器不会以任何方式修改nameCount,仅将其用作比较的平均值。
- 为循环添加退出条件终止,-1以及默认情况下应提供无效输入。 (不检查 字母输入)
醇>
case (4)