《字符串篇》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