字符串基本操作以及内存函数

/*
 ============================================================================
 Name        : TestString.c
 Author      : lf
 Version     :
 Copyright   : Your copyright notice
 Description : C语言字符串相关操作以及内存函数
 1 在Java中有String数据类型,但是在C语言中没有
 2 在C语言中一般用字符数组来表示字符串,因为在C中没有String这个数据类型
        表示字符串的两种方式:
        第一种:
   char c0[]="hello";
       第二种:
   char c00[]={'h','e','l','l','o'};

      注意的问题:
  1 在第一种方式中系统会自动在其末尾添加'\0'即变成了"hello\0"
            所以sizeof(&c0)大小为6.但是strlen(&c0)=5而不是6.
            这是因为strlen()只获取'\0'之前的长度.
  2 字符常量不可以写.
    char *c="hello";
    *c='A';//报错:Segmentation fault
            因为"hello"是字符串常量存储在文字常量区;若去修改一个常量的值当然是不行的
 ============================================================================
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <memory.h>

void test0();
void test1();
void test3();
void test4();
void test5();
void myStrrev(char *p);
void myStrupr(char *p);
void myStrlwr(char *p);

char charArray1[20]="hello hello";
char charArray2[20]="world world";

int main(void) {
	test0();
	test1();
	test2();
	test3();
	test4();
	test5();
	return EXIT_SUCCESS;
}

/**
 * 字符数组的初始化
 */
void test0(){
	char c[5]={'h','e','l','l','o','\0'};
	printf("c=%x\n",c);
	printf("c=%s\n",c);

	char d[10]="hello";
	printf("d=%s\n",d);
	printf("==========\n");
}

/**
 * 字符串常量不可以修改
 * Segmentation fault
 */
void test1(){
	char *c="hello";
	printf("c=%s\n",c);
	printf("==========\n");
	//报错   Segmentation fault
	//*c='A';

	//错误的做法.数组越界
	//a[10]="hello";代表的是从数组下标为10的位置开始存储
	char a[10];
	a[10]="hello";
}

/**
 * 利用字符串初始化字符数组
 */
void test2(){
	//char c[15]={"morning"};
	//一般简写为:
	char c[15]="morning";
	printf("c=%s\n",c);
	printf("==========\n");

}

/**
 * 字符串的遍历
 * putchar()输出一个字符
 */
void test3(){
	int len=0;
	char *str="hello world";
	printf("size of hello world=%d\n",sizeof("hello world"));
	//存储字符串首地址
	char *p=str;
	//*str的内容不为0(即最后的终止符)时输出字符
	while(*str){
		putchar(*str);
		str++;
		len++;
	}
	printf("\n");
	printf("str=%s,len=%d\n",p,len);
	printf("==========\n");
}

/**
 * 字符串常用操作
 * 0 strlen()求字符串长度
 * 1 strstr()查找字符串
 * 2 strcmp()按照ASCII对比字符串的大小(文件夹按照字母排序的大小一样)
 * 3 strcha()查找字符在字符串中首次出现的位置
 * 4 strcat()连接字符串
 * 5 atoi()字符串转整数
 * 6 myStrrev()字符串逆转
 * 7 myStrupr()字符串转大写
 * 8 myStrlwr()字符串转小写
 */
void test4(){

	//strlen()求字符串长度
	char c0[]="hello";
	char c00[]={'h','e','l','l','o'};
	printf("c0 strlen =%d\n",strlen(&c0));//5
	printf("c00 strlen =%d\n",strlen(&c00));//5

	printf("sizeof(*&c0) =%d\n",sizeof(*&c0));//6
	printf("sizeof(*&c00) =%d\n",sizeof(*&c00));//5
	printf("==========\n");

	//strstr()查找字符串
	char c1[20]="hello world";
	char c2[5]="or";
	char *p=strstr(c1,c2);
	if (p==NULL) {
		printf("NULL\n");
	} else {
		printf("p=%x,*p=%c\n",p,*p);
	}

	//strcmp()对比字符串的大小
	char c3[6]="hello";
	char c4[6]="hello";
	int result=strcmp(c3,c4);
    if (result==0) {
    	printf("char c3 = char c4 \n");
	} else if(result<0){
		printf("char c3  < char c4  \n");
	}else{
		printf("char c3  > char c4  \n");
	}

    //strchr查找字符在字符串中首次出现的位置
    char c5[6]="hello";
    char c='e';
    char *f=strchr(c5,c);
    if(f==NULL){
    	printf("not found\n");
    }else{
    	printf("found ! location=%x\n",f);
    }

    //strcat()连接字符串
    char c6[6]="hello";
    char c7[6]="hello";
    char *n=strcat(c6,c7);
    printf("strcat result=%s\n",n);

    //atoi()字符串转整数
    char c8[6]="123456";
    int i=atoi(c8);
	printf("i=%d\n",i);

	//myStrrev()字符串逆转
    char str[30]="123456789";

    //myStrrev(str);
    //myStrrev(&str);

    //char *pointer=&str;
    //myStrrev(pointer);

	printf("str=%s\n",str);

	char charString[30]="abcd";
	myStrupr(&charString);
	printf("charString=%s\n",charString);
	myStrlwr(&charString);
	printf("charString=%s\n",charString);

	printf("==========\n");
}

/**
 * 实现字符串的逆转
 */
void myStrrev(char *p){
	//获取字符串长度
	int len=strlen(p);
	int i;
	for(i=0;i<len/2;i++){
		char c=p[i];
		p[i]=p[len-1-i];
		p[len-1-i]=c;
	}

}

/**
 * 实现字符串小写转大写
 */
void myStrupr(char *p) {
	while (*p != '\0') {
		if (*p >= 'a' && *p <= 'z') {
			*p = *p - 32;
		}
		p++;
	}
}

/**
 * 实现字符串大写转小写
 */
void myStrlwr(char *p) {
	while (*p != '\0') {
		if (*p >= 'A' && *p <= 'Z') {
			*p = *p + 32;
		}
		p++;
	}
}

/**
 * 常用内存函数
 * 1 memset()更改字符中的字符
 * 2 memcpy()从源字符串中拷贝n个字节到目标字符串中
 *   还有一个memccpy()与此类似但更灵活和强大
 * 3 memchr()在字符串的前n个字节中搜索字符
 * 4 memicmp()比较两个字符串前n个字节,且忽略大小写
 *   (非标准C函数,在此未实现)
 *
 */
void test5(){
	//memset()
	char c0[10]="hello";
	memset(c0,'A',3);
	printf("c0=%s\n",c0);

	//memcpy()
	char c1[10]="123456";
	memcpy(c1,c0,3);
	printf("c1=%s\n",c1);

	//memchr()
	char c3[10]="hellohi";
	char *p=memchr(c3,'e',10);
	if (p==NULL) {
		printf("NOT FOUND\n");
	} else {
		printf("result=%c\n",*p);
	}

	printf("==========\n");
}

时间: 2024-11-03 03:25:37

字符串基本操作以及内存函数的相关文章

[c/c++] programming之路(23)、字符串(四)——strncat,atoi,strcmp,strlen等,以及常用内存函数

一.strncat及自行封装实现 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> //<string.h>是C版本的头文件,包含比如strcpy.strcat之类的字符串处理函数. //<cstring>是C++版本的<string.h> //<string>定义了一个string的字符串类,包含

JAVASE02-Unit01: API文档 、 字符串基本操作

API文档 . 字符串基本操作 文档注释 package day01; /** * 文档注释只能定义在三个地方: * 类,方法,常量 * * 文档注释是功能注释,用来说明功能作用 * 在类上使用的目的是说明当前类的设计目的 * * @author adminitartor * @version 1.0 * @see java.lang.String * @since JDK1.0 * */ public class DocApiDemo { /** * sayHello方法中的问候语 */ pu

【微软100题】定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。 如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。

package test; /** * 定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部. 如把字符串abcdef左旋转2位得到字符串cdefab. 请实现字符串左旋转的函数. * 要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1). * * @author Zealot * */ public class MS_26 { private void rotateString(String s, int rotate) { System.out.println(

Python3字符串各种内置函数详解

● Python3访问字符串 Python不支持单字符类型,单字符在Python中也是作为一个字符串来使用: 字符串切片截取: 空值 空值是Python里一个特殊的值,用None表示.None不能理解为0,因为0是有意义的,而None是一个特殊的空值. 最后,理解变量在计算机内存中的表示也非常重要.当我们写: a = 'ABC' 时,Python解释器干了两件事情: 在内存中创建了一个'ABC'的字符串: 在内存中创建了一个名为a的变量,并把它指向'ABC'. 也可以把一个变量a赋值给另一个变量

python基础--字符串的内置函数

1. bit_length()  获取对应字符串的比特长度,就是在内存的长度 举例: a = 5 b = a.bit_length() print(b) 3 2. capitalize()   将首字母大写  太简单就不举例了 3. casefold()与lower()  他们的作用都是将字符串全部改为小写 不过lower()只能做英文转换 4. center(num," **")  设置字符串的宽度,并且将字符串居中,若是有后面的字符,就是将后面的字符作为指定宽度不够的填充 举例:

内存函数

//内存函数 #include <stdio.h> #include <memory.h> #include <strings.h> void main2(){ //memset赋值函数 char str[45] = "hello luoxu hello c"; memset(str,'A',6); //第一个参数内存首地址,第二个参数要赋值的值,第三个参数从首地址前进多少个字节 printf("%s\n",str); //AAA

10天精通Sass 之 处理字符串与数字的函数

Sass的函数简介 Sass中自备了一系列的功能函数,包括: - 字符串函数 - 数字函数 - 列表函数 - 颜色函数 - Introspection函数 - 三元函数 除了Sass中已提供的函数,我们还可以根据自己的需求定义函数,称为自定义函数. 字符串函数 * unquote($string) * :删除字符串中的引号 * quote($string) * :给字符串加引号 unquote()函数 用来删除字符串的引号,如果这个字符串没有引号,则返回原始字符串. .test1 { conte

vb 字符串和数字相互转换函数

VB中的字符串函数比较多,也比较方便,就不一一介绍了.本文主要对字符串相关的转换函数做一些小结.字符串转换的函数主要有: Str()和Val()用于字符串和数字的相互转换; Chr()和Asc()用于字符串和AscII码的相互转换; Chrw()和Ascw()用于Unicode码和中文的相互转换; Format()函数用途十分广泛的一个函数,功能十分强大. 在这些函数中前两对和Format()函数是我们经常用到的,这里只给出前两对的几个简单例子: (1) MyString = Str(-459.

字符串 映射相应的 函数 字符串驱动技术—— MethodAddress , MethodName , ObjectInvoke

http://blog.csdn.net/qustdong/article/details/7267258 字符串驱动技术—— MethodAddress , MethodName , ObjectInvoke 标签: delphiintegerfunctionobjectsoapclass 2012-02-17 11:46 1139人阅读 评论(0) 收藏 举报  分类: Delphi(24)  首先看一段Delphi帮助中的介绍(After Delphi 6 ): Returns the a