用C语言按字母顺序排列字符串
我制作了一个程序,如果用户选择选项2,它会要求用户输入一个名称,并将该名称存储在字符串中,如果用户选择选项3,它会显示该名称。现在对于选项4,它需要按字母顺序排列名称,因此当我再次选择选项3查看名称时,它将按字母顺序显示名称。我的朋友告诉我使用strcpy(),我尝试过,但没有太成功 这是我的代码:用C语言按字母顺序排列字符串,c,arrays,string,sorting,alphabetical-sort,C,Arrays,String,Sorting,Alphabetical Sort,我制作了一个程序,如果用户选择选项2,它会要求用户输入一个名称,并将该名称存储在字符串中,如果用户选择选项3,它会显示该名称。现在对于选项4,它需要按字母顺序排列名称,因此当我再次选择选项3查看名称时,它将按字母顺序显示名称。我的朋友告诉我使用strcpy(),我尝试过,但没有太成功 这是我的代码: //This is my code: #include<stdio.h> #include<string.h> int main() { int i = 0;
//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");
}
//这是我的代码:
#包括
#包括
int main(){
int i=0;
int j=0;
而(1){
int-num;
字符名[500][100],t[100];
printf(“\n按1查看作者信息”\n”);
printf(“按2键输入名称\n”);
printf(“按3查看名称”);
printf(“按4将名称字母化\n”);
scanf(“%d”和&num);
char-arr[100];
如果(num==1)
{
printf(“-----------------------\n”);
printf(“名称”);
printf(“132\n”);
printf(“-----------------------\n”);
}
如果(num==2)
{
printf(“输入名称(无空格)\n”);
scanf(“%s”,arr);
strcpy(名称[i],arr);
i++;
}
如果(num==3)
{
printf(“\n*******************************”);
对于(int j=0;j 0){
strcpy(t,名称[j-1]);
strcpy(名称[j-1],名称[j]);
strcpy(名称[j],t);
}
}
}
;
}
返回(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);
}
}
}
}
intk;
如果(num==4){
对于(j=0;j0){
strcpy(t,名称[k]);
strcpy(名称[k],名称[k+1]);
strcpy(名称[k+1],t);
}
}
}
}
我对冒泡排序使用了一种稍微不同的方法,这就是我学习它的方式,希望你能理解它
注意:复制完整字符串不是最好的方法,但我不知道您是否已经了解了指针。如果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);
}
}
}
}
intk;
如果(num==4){
对于(j=0;j0){
strcpy(t,名称[k]);
strcpy(名称[k],名称[k+1]);
strcpy(名称[k+1],t);
}
}
}
}
我对冒泡排序使用了一种稍微不同的方法,这就是我学习它的方式,希望你能理解它
注意:复制完整字符串不是最好的方法,但我不知道您是否已经了解了指针。修改了代码。在这种情况下,开关盒看起来会更漂亮,循环也不会结束。按照@Barmar所说的,您的循环有一个
返回0因此,代码>会提前终止。我已经改变了你的代码的一些元素,因为其中一些适合不受干扰等等
变化表
除了开关柜的实现之外
字符数组的名称和位置。对于t[100],因为它是一个临时对象/变量,所以我将它移动到案例(4)
(参考第63行)
在修改后的代码中),以便根据需要进行创建
早期创建的原始代码的。将t重命名为temp。
至于arr,我已经重命名了它,以便它更清晰(nameIn表示
名称输入)
num的名称。为了便于理解代码,我将其设置为namecont,以指示名称的数量或大小。
重新构造循环,使其计数器不会以任何方式修改名称计数,仅将其用作比较的平均值。
增加了循环终止的退出条件,-1以及提供无效输入时的默认情况。(不检查
字母输入法)
修改代码
#包括
#包括
#包括
int main()
{
int namecont=0,num=0;
while(num!=-1)
{
char-nameIn[100];
字符名[100][100];
printf(“\n按1查看作者信息”\n”);
printf(“按2键输入名称\n”);
printf(“按3查看名称”);
printf(“按4将名称字母化\n”);
scanf(“%d”和&num);
开关(num)
{
案例(1):
{
printf(“-----------------------\n”);
printf(“名称”);
printf(“132\n”);
printf(“-----------------------\n”);
打破
}
案例(2):
{
printf(“输入名称(无空格)\n”);
scanf(“%s”,nameIn);
strcpy(名称[名称计数],名称输入);
nameCount++;
打破
}
案例(3):
{
printf(“\n*******************************”);
对于(int ctr=0;ctr 0)
{
字符温度[100]=“”;
strcpy(临时,名称[ctrLv1]);
strcpy(名称[ctrLv1],名称[ctrLv2]);
strcpy(名称[ctrLv2],温度);
}
}
}
打破
}
情况(-1):
{
printf(“\nExit