《字符串篇》stdio.h对char[]的操作

isspace()判断单个字符是否为空

参考链接:https://www.cnblogs.com/nxopen2018/p/15067910.html

isspace()函数用于判断字符是否为空白字符。

语法

int isspace(int ch);

isspace()函数的语法参数说明如下:

参数ch为一个待检查的字符。

isspace()函数的返回值:不是空白字符返回0,是则返回非0。

示例

本示例演示用isspace()函数判断输入的字符是否为空白字符。其具体代码如下:

#include <stdio.h>
#include <ctype.h>

int main()
{
	char ch;
	printf("input a character");//输入一个字符
	scanf_s("%c", &ch);
	if (isspace(ch))//判断输入字符是否为空白字符
		printf("%c is space\n", ch);
	else
		printf("%c is not space\n", ch);

	return 0;
}

sprintf()输出到字符串

链接地址:https://www.cnblogs.com/yeshenmeng/p/11556617.html
头文件:stdio.h

函数原型:int sprintf(char *buffer, const char *format, [argument]…)

参数:

(1)buffer:是char类型的指针,指向写入的字符串指针;

(2)format:格式化字符串,即在程序中想要的格式;

(3)argument:可选参数,可以为任意类型的数据;

函数返回值:字符串的长度;

用处:

(1)格式化数字字符串:在这点上sprintf和printf的用法一样,只是打印到的位置不同而已,前者打印给buffer字符串,后者打印给标准输出,所以sprintf也可以用来将整型转化为字符串,比itoa效率高且如此地简便~比如:sprintf(buffer, “%d”, 123456);执行后buffer即指向字符串“123456”~

(2)连接字符:

下面通过两个例子来说明这个问题:

(a)连接以’\0’结束的字符串:

#include<stdio.h>
int main()
{
	char buffer[10];
	char *a = “1234”;
	char *b = “5678”;
	sprintf(buffer, ”%s%s”, a, b);
	printf(”%s\n”, buffer);
	return 0;
}

(b)连接结尾没有’\0’的字符数组或字符串缓冲区:

#include<stdio.h>
int main()
{
	char a[] = {‘1’, ‘2’, ‘3’, ‘4’};
	char b[] = {‘5’, ‘6’, ‘7’, ‘8’};
	char buffer[10];
	sprintf(buffer, ”%.4s%.4s”, a, b);
	printf(”%s\n”, buffer);
	return 0;
}

(c)如果我们想动态获取要处理的字符缓冲区长度,则将上面sprintf改为:

sprintf(buffer, “%.*s%.*s”, sizeof(a), a, sizeof(b), b);

即可~

sprintf_s()格式化输出到字符串

首先介绍,sprintf

函数功能:把格式化的数据写入某个字符串

头文件:stdio.h
函数原型:int sprintf( char *buffer, const char *format [, argument] … );
返回值:字符串长度(strlen)

在将各种类型的数据构造成字符串时,sprintf 的功能很强大。sprintf 与printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。这也导致sprintf 比printf 有用得多.。

printf 和sprintf 都使用格式化字符串来指定串的格式,在格式串内部使用一些以“%”开头的格式说明符(format specifications)来占据一个位置,在后边的变参列表中提供相应的变量,最终函数就会用相应位置的变量来替代那个说明符,产生一个调用者想要的字符串。

输出格式控制:

%% 印出百分比符号,不转换。
%c 整数转成对应的 ASCII 字元。
%d 整数转成十进位。
%f 倍精确度数字转成浮点数。
%o 整数转成八进位。
%s 整数转成字符串。
%x 整数转成小写十六进位。
%X 整数转成大写十六进位。

示例:

#include<iostream>
#include<cstdio>

using namespace std;

int main()
{
	char str[20];

	char *s1="hello"; 
	char *s2="world";

	sprintf(str,"%s %s",s1,s2);

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

	char str_1[20];
	int n,a=3,b=5;

	n=sprintf(str_1,"%d + %d = %d",a,b,a+b);//返回字符个数

	printf("[%s] :字符数为%d\n",str_1,n);

	char str_2[20];

	sprintf(str_2,"%x %o abcdefg",123,123);//控制输出字符串的转换为相应的进制数
										   //分别转换为十六进制和八进制
	puts(str_2);

	sprintf(str_2,"%X %o",123,123);//给数组赋新值

	puts(str_2);//仅输出 "7B 173",说明sprintf向字符串str_2写入字符后,尾部自动加了'\0'

	cout<<str_2[8]<<endl;//输出为b  即str_2[7]='a' str_2[8]='b' ... 说明sprintf()知识重新修改了前面的字符。

	system("pause");
	return 0;
}

但是在MSDN中,有这样一段话:

使用 sprintf,无法限制编写的字符数,这意味着,使用 sprintf 的代码易出现缓冲区溢出。

使用sprintf_s更加安全一点。

sprintf_s()是sprintf()的安全版本,通过指定缓冲区长度来避免sprintf()存在的溢出风险。在使用VS2008时如果你使用了sprintf函数,那么编译器会发出警告:使用sprintf存在风险,建议使用sprintf_s。这个安全版本的原型是:

int sprintf_s(char *buffer,size_t sizeOfBuffer,const char *format [,argument] ... );

示例:

#include<iostream>
#include<cstdio>

using namespace std;

int main()
{
	char str[20];

	char *s1="hello"; 
	char *s2="world";

	sprintf_s(str,sizeof(str),"%s %s",s1,s2);//sizeof(str)的大小必须大于等于待写入字符串的大小加一,否则会出错。

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

	char str_1[20];
	int n,a=3,b=5;

	n=sprintf_s(str_1,sizeof(str_1),"%d + %d = %d",a,b,a+b);//返回字符个数

	printf("[%s] :字符数为%d\n",str_1,n);

	char str_2[20];

	sprintf_s(str_2,sizeof(str_2),"%x %o abcdefg",123,123);//控制输出字符串的转换为相应的进制数
										   //分别转换为十六进制和八进制
	puts(str_2);

	sprintf_s(str_2,sizeof(str_2),"%X %o",123,123);//给数组赋新值

	puts(str_2);//仅输出 "7B 173",说明sprintf_s向字符串str_2写入字符后,尾部自动加了'\0'

	cout<<str_2[8]<<endl;//未输出b,说明sprintf_s是对整个数组重新写入。

	system("pause");
	return 0;
}

strcmp()比较字符串

C 库函数

int strcmp(const char *str1, const char *str2)

把 str1 所指向的字符串和 str2 所指向的字符串进行比较。

声明
下面是 strcmp() 函数的声明。

int strcmp(const char *str1, const char *str2)

参数
str1 要进行比较的第一个字符串。
str2 要进行比较的第二个字符串。

返回值
该函数返回值如下:

如果返回值小于 0,则表示 str1 小于 str2。
如果返回值大于 0,则表示 str1 大于 str2。
如果返回值等于 0,则表示 str1 等于 str2。
实例

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

int main ()
{
   char str1[15];
   char str2[15];
   int ret;


   strcpy(str1, "abcdef");
   strcpy(str2, "ABCDEF");

   ret = strcmp(str1, str2);

   if(ret < 0)
   {
	  printf("str1 小于 str2");
   }
   else if(ret > 0) 
   {
	  printf("str1 大于 str2");
   }
   else 
   {
	  printf("str1 等于 str2");
   }

   return(0);
}

让我们编译并运行上面的程序,这将产生以下结果:

str1 大于 str2

strncmp()比较字符串

C 库函数

int strncmp(const char *str1, const char *str2, size_t n)

把 str1 和 str2 进行比较,最多比较前 n 个字节。

声明
下面是 strncmp() 函数的声明。

int strncmp(const char *str1, const char *str2, size_t n)

参数
str1 -- 要进行比较的第一个字符串。
str2 -- 要进行比较的第二个字符串。
n -- 要比较的最大字符数。

返回值
该函数返回值如下:

如果返回值 < 0,则表示 str1 小于 str2。
如果返回值 > 0,则表示 str2 小于 str1。
如果返回值 = 0,则表示 str1 等于 str2。

实例
下面的实例演示了 strncmp() 函数的用法。

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

int main ()
{
   char str1[15];
   char str2[15];
   int ret;


   strcpy(str1, "abcdef");
   strcpy(str2, "ABCDEF");

   ret = strncmp(str1, str2, 4);

   if(ret < 0)
   {
	  printf("str1 小于 str2");
   }
   else if(ret > 0) 
   {
	  printf("str2 小于 str1");
   }
   else 
   {
	  printf("str1 等于 str2");
   }

   return(0);
}

让我们编译并运行上面的程序,这将产生以下结果:

str2 小于 str1

vsprintf输出到字符串

C 库函数

int vsprintf(char *str, const char *format, va_list arg)

使用参数列表发送格式化输出到字符串。

示例:

#include <stdio.h>
#include <stdarg.h>

char buffer[80];
int vspfunc(char *format, ...)
{
   va_list aptr;
   int ret;

   va_start(aptr, format);
   ret = vsprintf(buffer, format, aptr);
   va_end(aptr);

   return(ret);
}

int main()
{
   int i = 5;
   float f = 27.0;
   char str[50] = "runoob.com";

   vspfunc("%d %f %s", i, f, str);
   printf("%s\n", buffer);

   return(0);
}

让我们编译并运行上面的程序,这将产生以下结果:

5 27.000000 runoob.com
posted @ 2023-07-31 14:55  Fusio  阅读(30)  评论(0编辑  收藏  举报