C语言中字符串数组排序问题

排序法 C语言常考的十大排序法 数列、字符的排序 通过对近各大试卷题型分析,总结出 对于数据排序的十大方法,希望对大家有所帮助 方法一:冒泡排序法(升序排序法) 方法二:选择排序法 方法三:插入排序法 方法四:希尔排序法(Shell Sort) 方法五:归并排序法 方法六:快速排序法(交换排序法) 方法七:堆排序法 方法八:计数排序法 方法九:桶排序法 方法十:基数排序法 1.冒泡排序法 1.1 算法描述 步骤1: 比较相邻的元素。如果第一个比第二个大,就交换它们两个; 步骤2: 对每一对相邻元素作同样的工作,从开始第一对到 阅读详情

对字符串的排序时,应该注意 交换 要用函数strcpy覆盖字符串的内容进行交换,不同于简单的数字交换。

1.

这是用选择排序法对一个整型数组进行从大到小的排序;

//选择排序法
#include <stdio.h>
#define N 5
int main(){
	int a[N]={4,5,2,3,1};
	int i,j,k,temp;
	for(i=0;i<N-1;i++){
		k=i;
		for(j=i+1;j<N;j++){
			if(a[k]<a[j])  
				k=j;
		}
//
		if(k!=i){ 
			temp=a[k];
			a[k]=a[i];
			a[i]=temp;
		}
	}
	for(i=0;i<N;i++) printf("%d",a[i]);
	return 0;
}

2.

参照上面的排序方法对字符串数组排序,会发现有报错;

#include <stdio.h>
#include <string.h>
int main(){
    char a[4][4]={"bbb","aaa","ttt","qqq"},temp[20];
    int i,j,k;
    for(i=0;i<4;i++){
        k=i;
        for(j=i+1;j<5;j++){
            if(strcmp(a[k],a[j])>0)
                k=j;
        }

        if(k!=i){  					//此处进行交换,出错;
            temp=a[k];
            a[k]=a[i];
            a[i]=temp;
        }
    }
    printf("After sorted:");
    for(i=0;i<5;i++){
        printf("%s\n",a[i]);
    }
}
/*
[Error] incompatible types in assignment of 'char [4]' to 'char [19]'*/

错误的原因在于,用二维数组 a [5] [5] 存放字符串的时候,对于每一个字符串:a[0] 、a[1]…里面存放的是一个字符串的地址,同时也是a[0]、a[1]…本身的地址;

用代码解释就是:

#include <stdio.h>
int main(){
	char a[20][20]={"abc","def"};
	printf("%d-%d\n",a[0],a[1]);
	;
	printf("%d-%d\n",&a[0],&a[1]);
	return 0;
} 

就是a[0] = &a[0]

结果

本来就是这样,数组在内存是连续的,所以想要交换里面的值——地址,肯定是错误的。

3.正确的方法之一是用函数strcpy覆盖字符串的内容进行交换;

#include <stdio.h>
#include <string.h>
int main(){
    char a[5][20];
    int i,j,k;
    for(i=0;i<5;i++){
        scanf("%s",a[i]);
    }
    for(i=0;i<4;i++){
        k=i;
        for(j=i+1;j<5;j++){
            if(strcmp(a[k],a[j])>0)
                k=j;
        }
       										//修改后的部分
        if(k!=i){
            char temp[100];
            strcpy(temp, a[k]);
            strcpy(a[k], a[i]);
            strcpy(a[i], temp);
        }
    }
    printf("After sorted:");
    for(i=0;i<5;i++){
        printf("%s\n",a[i]);
    }
}

4.还有一种思路,加入另一个指针数组,对应指向二维数组,再把指针数组里的指针进行排序,最后输出依次整个指针数组。

这样为什么可以让里面的地址进行交换?
原因:指针数值里放的的指针 p[ 0 ] 、p[ 1 ]…不等于 &p[0]、&p[ 1 ]…所以可以进行交换。
#include <stdio.h>
int main(){
	char a[4][4]={"bbb","aaa","ccc","ddd"};
	char *p[4];
	int i;
	for(i=0;i<4;i++){
		p[i]=a[i];
	}
	printf("%d-%d\n",p[0],p[1]);
	printf("%d-%d\n",&p[0],&p[1]);
	return 0;
} 

在这里插入图片描述

#include <stdio.h>
#include <string.h>
int main(){
    char a[4][4]={"bbb","aaa","ttt","qqq"};
    char *pStr[4],*temp; 				//定义另外一个指针数组;
    int i,j;
    for(i=0;i<4;i++){
    	pStr[i]=a[i];      				//让指针数组内容对应指向二维数组a;
	}
    for(i=0;i<4-1;i++){
        for(j=i+1;j<4;j++){				//直接进行交换指针数组里面的值——地址;
            if(strcmp(pStr[i],pStr[j])>0){
            	temp = pStr[i];
				pStr[i] = pStr[j];
				pStr[j] = temp; 
			}
        }
    }
    printf("After sorted:\n");
    for(i=0;i<5;i++){
        printf("%s\n",pStr[i]);
    }
}
C语言入门(大一笔记)数组篇 c 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容.. 阅读详情

相关推荐

C语言数组应用举例

【示例1】求一个整型数组中的最大值和最小值。i<=9;i++)从控制台获取用户输入并赋值给数组元素max=a[0];min=a[0];假设a[0]是最大值也是最小值for(i=1;i<=9;或者return 0;*/运行结果:这段代码有两点需要说明:从控制台获取数组元素时,我们一次性输入10个整数才按下回车键,而不是每输入一个整数就按一次回车键,这正是利用了标准输入缓冲区。

weixin_40704392的博客 1688

C语言对字符串数组进行排序

C语言对字符串数组进行排序

qq_46091485的博客 1402

C语言根据汉字拼音首字母排序

这是一篇关于C语言根据姓名拼音首字母排序的文章。 我想到写这篇文章,主要是因为我在学校期末课设做通讯录管理,我想做一个姓名拼音首字母排序,但是在网上找了好多都是些奇奇怪怪的方法,有用glib库里的,但是现在版本的Dev-C++并没有这个库。还有用一些神奇的函数取文字拼音首字母再排序的,这个方法我是没看懂也不确定是否是C语言的(因为那篇文章没有标明所用语言,里面还用了好多我没见过的指令) 后来,我在重新翻教材看案例时看到了strcmp,虽然教材上的案例是对英文单词进行排序,但是我也发现,当我们储存字符串时,储

weixin_52511826的博客 1万+

C语言数组的五种排序

目录 冒泡排序 快速排序 选择排序 插入排序 归并排序 冒泡排序 冒泡排序的基本思想:不断比较相邻的两个数,让较大的元素不断地往后移。经过一轮比较,就选出最大的数;经过第2轮比较,就选出次大的数,以此类推。对于具有N个元素的数组R[N],进行最多N-1轮比较; /** * 冒泡排序数组 * @param int a[] 要排序的数组 * @param int n 数组元素的个数 ...

Noteligiable的博客 2万+

ADC电路项目1——10bit SAR ADC 设计,smic18工艺,有工艺库,有效位数ENOB为9.8

包括详细仿真文档,原理介绍,完整电路图,仿真参数已设好,可直接使用,在自己的电脑上就可以运行仿真。本设计采用 smic18mmrf CMOS 工艺,使用栅压自举电路的采样开关,Vcm-based 开关。电容开关控制电路,10 位 DFF,最后用 10 位理想 DAC 模块将数字码转换为 10 进制量进。时序上级板采样的 DAC 电容阵列,两级动态比较器,比较器异步时钟,SAR 动态逻辑,DAC。10bit SAR ADC 设计,smic18工艺,有工艺库,有效位数ENOB为9.8。

qq_48407979的博客 814

UE4游戏开发:GameInstance与GameMode的实战应用与避坑指南

本文深入解析了UE4中GameInstance与GameMode的核心差异与实战应用。GameInstance作为贯穿游戏进程的全局单例,负责跨关卡数据持久化与系统管理;而GameMode则定义特定关卡内的游戏规则与逻辑,随关卡加载销毁。文章通过数据存储、动态模式切换及网络游戏等场景,提供了清晰的应用指南与常见避坑方案,帮助开发者构建更健壮的UE4游戏架构。

kubernetes8ctl的博客 230

C语言:字符串排序

C语言利用二维数组与起泡法给字符串排序

a486368464的博客 2万+

UG NX与PLC-1500的在环虚拟测试

TIA、PLCSIM、NetToPLCsim、KEPServerEX以及UG NX的在环虚拟测试

lvtlvtlvtlvt的博客 4218

对字符串数组 进行排序

String[] x = {"nba","abc","cba","zz","qq","haha"}; //自己写的排序 // 排序的方法 直接用的冒泡排序 以前都是比较数字 直接用 > < = 就好了 但是 字符串的比较怎么办? 用String类提供的compareTo 方法就可以了 for(in...

u013317653的专栏 7184

保姆级教程:用PyTorch从零实现SDE扩散模型(附完整代码与MNIST实战)

本文提供了一份详细的PyTorch教程,指导读者从零开始实现SDE扩散模型,并附有完整的代码示例和MNIST数据集实战。通过解释随机微分方程(SDE)的核心概念、模型架构设计、训练流程实现以及采样生成过程,帮助开发者掌握扩散模型的构建与应用。

weixin_28677005的博客 265

ANSYS APDL齿轮建模实战:从渐开线方程到完整3D模型的保姆级教程

本文详细介绍了使用ANSYS APDL进行齿轮建模的全过程,从渐开线方程的数学基础到完整3D模型的创建。通过参数化命令流实现高精度齿轮建模,特别适合机械设计和仿真分析需求。教程包含关键参数计算、APDL环境配置、单齿齿廓建模以及全齿轮阵列复制等实用技巧,帮助工程师快速掌握ANSYS APDL在齿轮建模中的应用。

lg888的博客 446

【C/C++】C语言字符串数组排序问题

如果返回值大于0,则表示第一个字符串比第二个字符串大。如果返回值等于0,则表示两个字符串相等;如果返回值小于0,则表示第一个字符串比第二个字符串小;在C语言中,我们可以通过遍历字符串的每个字符来比较字符串的大小,而不使用strcmp函数。大于0的情况下,字符串s1比s2大;小于0的情况下,字符串s1比s2小;strcmp函数比较两个字符串的大小,并返回一个整数值。在C语言中,可以使用。

强者征服今天,懦夫哀叹昨天,懒汉坐等明天。 726

保姆级教程:用sw_urdf_exporter插件将Solidworks机械臂模型转为ROS可用的URDF

本文提供了一份详细的保姆级教程,指导用户使用sw_urdf_exporter插件将Solidworks机械臂模型转换为ROS可用的URDF文件。从环境准备、插件配置到模型预处理和关键参数设置,再到ROS环境集成测试和性能优化,全面覆盖了机械臂URDF转换的全流程。特别适合机器人工程师和ROS开发者快速实现Solidworks模型到ROS环境的无缝迁移。

weixin_29300931的博客 399

二维字符串数组排序_关于函数中传参问题(C语言)

字符串数组在函数中的传参类型是“指向字符数组的指针”,并且由于直接修改了原始数据,因此在函数调用结束后,这些更改仍然有效。

qq_73908718的博客 827

YOLOv8交通监控全方案:精准车辆计数+违章(闯红灯/压线)识别,拿来就落地!

作为深耕计算机视觉落地的开发者,我见过太多交通监控的“伪智能”——传统系统要么车辆计数不准(漏计/重复计数),要么违章识别滞后(靠人工回看录像),甚至连“闯红灯、压线”这类常见违章都无法实时判定,完全满足不了实际交通管理需求。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 646

【论文精读】《Towards Deep Learning Models Resistant to Adversarial Attacks》

本文探讨了深度学习模型在面对对抗性攻击时的脆弱性,并提出了一种基于鲁棒优化的方法来增强神经网络的对抗鲁棒性。通过鞍点优化框架,作者提供了对抗攻击和防御机制的统一视角,并在MNIST和CIFAR-10数据集上验证了其方法的有效性。对抗训练的核心思想是将对抗样本引入训练过程,使模型能够学习到对抗样本的特征,从而提升其鲁棒性。本文通过鞍点优化框架提出了一种基于鲁棒优化的对抗训练方法,显著提升了深度学习模型的对抗鲁棒性。本文为深度学习模型的对抗鲁棒性研究提供了新的理论和实证支持,同时为未来研究指明了方向。

nmdbbzcl的博客 610

排序问题c语言不用数组,请教多个字符串排序(不用数组)

该楼层疑似违规已被系统折叠隐藏此楼查看此楼#include#includestructstud{char*pp;intsum;structstud*next;};structstud*creat1(intn){structstud*head,*newer,*p1,*p2;intt=0,k=0;char*pp1;printf("输入字符串:");newer=(s...

weixin_32672471的博客 239

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【C语言项目实战4——数组的以及应用】

数组是指一组数据的集合,数组中的每个数据称为元素,在数组中可以存放任意类型的元素,但是同一个数组里存放的元素类型必须一致,每个元素可以通过一个索引(下标)来访问他们,并且数据可以分为一维数组和二维数组。数组在C语言当中是极其重要的知识点,在通过学习数组的相关知识点后,就可以开始建立一些小型的项目,例如扫雷,五子棋,在我的相关文章都是有分类的,可以先学习相关的数组知识点,在通过实战练习巩固知识点,最后完成自己的打一个小型项目。

weixin_64993156的博客 1280

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

c语言数组参数问题,C语言多维数组参数传递问题

偶然间写了一个字符串数组的排序函数,但老是达不到理想的效果,找了半天才发现是形式参数与实际参数维度不等长导致的。一个简单的二分查找字符串数组算法实现程序如下:int BinarySearch( const char sArr[][100], const char *sSub, int iLen){int iLeftIdx = 0;int iRightIdx= iLen - 1;int iMidId...

weixin_34239861的博客 353

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

第五章:C 语言数组与字符串

本章将详细介绍数组和字符串的基本操作,同时深入讲解冒泡排序算法以及字符串处理函数,最后通过实现一个简单的学生成绩管理系统来综合运用这些知识。由于数组在内存中是连续存储的,我们可以通过数组首元素的地址和元素的偏移量来访问数组中的任意元素。时,编译器会根据初始化列表中的元素个数自动确定数组的长度为 3。未初始化,数组中的元素值是不确定的,它们包含的是内存中原来存储的随机值。数组元素在内存中是连续存储的,相邻元素的地址差值取决于元素的类型。数组时,系统会在内存中为其分配连续的存储空间,用于存储 5 个。

m0_69989279的博客 2085

C语言编程>第二十一周 ⑤ 下列给定程序中,函数fun的功能是:用冒泡法对5个字符串按由小到大的顺序进行排序。

例题:下列给定程序中,函数fun的功能是:用冒泡法对5个字符串按由小到大的顺序进行排序。 注意:不要改动main函数,不能增行或删行,也不能更改程序的结构。 代码如下: #include<stdio.h> #include<string.h> #define MAX 20 void fun(char*str[5]) { int i,j; char*p; for(i=0;i<5;i++) { for(j=i+1;j<5;j++) { if(strcmp

朽木自雕i的博客 1万+

c语言数组的实验报告结果思考,第七章实验报告(数组实验)

C语言程序设计实验报告实验项目:1、一维数组的应用2、二维数组的应用3、字符数组应用姓名:徐溢璠 实验地点: 514实验室 实验时间:2019年5月29日一、实验目的与要求1、一维数组的应用定义一个一维整型数组,其大小为10,即它能存放10个数据;使用循环语句,利用随机函数产生10个整数存放在数组中;编写排序函数sort1();使用循环语句,将排好序的10个数依次输出。2、二维...

weixin_32296949的博客 9745

c语言传递二维字符串数组指针,C语言之对于将二维数组作为参数传递的思考

这两天在学习扫地僧的课程(二级指针三种内存模型)时,最后的作业是把“第一种内存模型和第二种内存模型的内容复制到第三种内存模型中,并进行排序”。老师预定义了前两种内存模型的内容,和对应的函数实现接口,如下:char *p1[] = { "aaaaa", "cccccc", "bbbbb" };char buf2[10][30] = { "111111", "3333333", "2222222" }...

weixin_39996096的博客 1055

c 语言学习:基本操作,数组,字符串,指针

一. c语言学习 c语言学习连接: https://blog.youkuaiyun.com/zpj779878443/article/details/78229049 http://www.runoob.com/cprogramming/c-function-getchar.html H2O is是液体。 210 运算结果是 1024. c语言学习代码 // 判断闰年平年 #include &amp;amp;lt;s...

Heart_Sea的博客 594

c语言实验6数组实验报告,C语言实验6数组.doc

C语言实验6数组福建农林大学实验报告系(教研室): 专业: 年级: 2010实验课程: C语言程序设计 姓名: 学号: 实验室号:1#608_计算机号: 实验时间: 2012.11.12 指导教师签字: 成绩:实验6...

weixin_32027779的博客 779

数组课后作业——C语言数组——第四天

/for循环确定最大值,然后调换位置int main()printf("输入十个整数:");for(i=0;i<10;i<10;i++)x=i;n=i;if(n!=0)if(x!=9)printf("调整结果为:");for(i=0;i<10;i++)/*编译结果:输入十个整数:12 2 12 34 45 67 45 34 100 5调整结果为:2 12 12 34 45 67 45 34 5 100*/

qq_45821285的博客 1027
下一篇: scanf( “ %d\n ”,&a )scanf中%d后跟有\n时出现的问题
wang__Ray
博客等级 码龄8年 59粉丝 17原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值