9.1 基础
字符串,由一维字符数组组成(字符型)。 1 代表文本。2 验证用户输入。3 创建格式化字符串。用双引号包含。"This is a string", "Hello World", "xyz 123 *!#@&"都是字符串。
存储:在C中,存储成由一个指定的字符串末端的名为NULL的符号敞亮种植的字符型数组。NULL常量的数值是'\0'(转义序列符)。双引号不被存储为string的一部分。可以利用下标、指针符对string(数组)进行处理,NULL字符能用来监测string末端。
i/o
#include <stdio.h>
getchar()和putchar()提供single字符的io。
gets()和puts()由上面两个函数编写而来,能按完整单元处理字符串。
#include <stdio.h>
#define MSIZE 81//够80个字符+'\0'(合计81个)使用。
int main()
{
char message[MSIZE];
printf("Enter a string:\n");
gets(message);
printf("The string just entered is:\n");
puts(message);
//printf("s%\n", message)
return 0;
}
1 按Enter,产生一个\n,gets()解释这个字符为输入末端。除了\n,所有的输入都被存储在了message数组中
2 printf()能代替puts(),但scanf()不能代替gets()
processing
1 strcopy()把string2内容复制到string1
当string2[i]不等于'\0'时,循环,string1[i] = string2[i]。
*但需确保string1有足够的长度保存string2。
#include <stdio.h>
void strcopy(char [], char []); /* expects two arrays of chars */
int main()
{
#define LSIZE 81
char message[LSIZE]; /* enough storage for 80 characters plus '\0' */
char newMessage[LSIZE]; /* enough storage for a copy of message */
printf("Enter a sentence: ");
gets(message);
strcopy(newMessage, message); /* pass two array addresses */
puts(newMessage);
return 0;
}
/* copy string2 to string 1 */
void strcopy (char string1[], char string2[]) /* two arrays are passed */
{
int i = 0; /* i will be used as a subscript */
while (string2[i] != '\0') /* check for the end-of-string *///检测字符串末端
{
string1[i] = string2[i]; /* copy the element to string1 */
i++;
}
string1[i] = '\0'; /* terminate the copied string */
}
把赋值语句包含在while语句的测试部分内
#include <stdio.h>
int main()
{
#define LSIZE 81
char message[LSIZE]; /* enough storage for 80 characters plus '\0' */
char c;
int i;
printf("Enter a string:\n");
////////
i = 0;
while(i < (LSIZE-1) && (c = getchar()) != '\n')
{
message[i] = c; /* store the character entered */
i++;
}
message[i] = '\0'; /* terminate the string */
////////取代了上个代码中的gets()函数。构成一个从一个终端输入一正航字符的独立单元,因此这些语句能从main()函数移走。
printf("The string just entered is: \n");
puts(message);
return 0;
}
9.2 库函数
C标准库中,有大量字符串处理函数和字符处理函数。
字符串库函数(string.h)
名称 | 描述 |
---|---|
strcpy(str1, str2) | 复制str2到str1,包括'\0' |
strcat(str1, str2) | 附加str2到str1的末端 |
strlen(sting) | 返回string的长度,不包括'\0' |
strccmp(str1, str2) | 比str2 str1长,1<2返回-1,==返回0,>返回正整数 |
strncpy(str1, str2, n) | str2的n字符复制到str1,若str2<n,用'\0'补 |
strncmp(str1, str2, n) | 比str1 str2最多n个字符 |
strchr(string, char) | char在string中第一次出现的位置,返回这个字符地址 |
"Behop"大于"Beehive",因为h>e
字母排在后面的大,小写字母>大写字母
#include <stdio.h>
#include <string.h> /* required for the string function library */
int main()
{
#define MAXELS 50
char string1[MAXELS] = "Hello";
char string2[MAXELS] = "Hello there";
int n;
n = strcmp(string1, string2);
if (n < 0)
printf("%s is less than %s\n\n", string1, string2);
else if (n == 0)
printf("%s is equal to %s\n\n", string1, string2);
else
printf("%s is greater than %s\n\n", string1, string2);
printf("The length of string1 is %d characters\n", strlen(string1));
printf("The length of string2 is %d characters\n\n", strlen(string2));
strcat(string1," there World!");
printf("After concatenation, string1 contains the string value\n");
printf("%s\n", string1);
printf("The length of this string is %d characters\n\n",
strlen(string1));
printf("Type in a sequence of characters for string2:\n");
gets(string2);
strcpy(string1, string2);
printf("After copying string2 to string1");
printf(" the string value in string1 is:\n");
printf("%s\n", string1);
printf("The length of this string is %d characters\n\n",
strlen(string1));
printf("\nThe starting address of the string1 string is: %d\n",
(void *) string1);
return 0;
}
字符函数
ctype.h
原型 | 描述 |
---|---|
int isalpha(char) | 是字母返!0,or 0 |
int isupper(char) | 是大写返!0,or 0 |
int islower(char) | 是小写返!0,or 0 |
int isdigit(char) | 是0-9返!0,or 0 |
int isascii(char) | 是ASCII返!0,or 0 |
int isspace(char) | 是空格返!0,or 0 |
int isprint(char) | 是能打印返!0,or 0 |
int iscntrl(char) | 是控制字符返!0,or 0 |
int ispunct(char) | 是标点字符返!0,or 0 |
int toupper(char) | 是小写,则返回相应大写,or 不变 |
int tolower(char) | 是大写,则返回相应小写,or 不变 |
#include <stdio.h>
#include <ctype.h> /* required for the character function library */
int main()
{
#define MAXCHARS 100
char message[MAXCHARS];
void convertToUpper(char []); /* function prototype */
printf("\nType in any sequence of characters:\n");
gets(message);
convertToUpper(message);
printf("The characters just entered, in uppercase are:\n%s\n", message);
return 0;
}
// this function converts all lowercase characters to uppercase
void convertToUpper(char message[])
{
int i;
for(i = 0; message[i] != '\0'; i++)
message[i] = toupper(message[i]);
}
转换函数
stdlib.h
原型 | 描述 |
---|---|
int atoi(string) | 转换ASCII字符串为整数,在第一个非整数字符处停止转换 |
double atof(string) | 转换ASCII字符串为双精数值,在第一个不能被解释为双精的字符处停止转换 |
char[] itoa(string) | 转换一个整数为ASCII字符串。分配足够空间。 |
atoi和atof的使用
#include <stdio.h>
#include <string.h>
#include <stdlib.h> // required for test conversion function library
#define MAXELS 20
int main()
{
char test[MAXELS] = "1234";
int num;
double dnum;
num = atoi(test);
printf("The string %s as an integer number is %d\n", test,num);
printf("This number divided by 3 is: %d\n", num/3);
strcat(test, ".96");
dnum = atof(test);
printf("\nThe string %s as a double number is: %f\n", test,dnum);
printf("This number divided by 3 is: %f\n", dnum/3);
return 0;
}
9.3 输入数据验证
验证输入的是否为整数
1
#include <stdio.h>
#include <stdlib.h> /* needed to convert a string to an integer */
#define MAXCHARS 40
#define TRUE 1
#define FALSE 0
int isvalidInt(char []); /* function prototype */
int main()
{
char value[MAXCHARS];
int number;
printf("Enter an integer: ");
gets(value);
if (isvalidInt(value)== TRUE)
{
number = atoi(value);
printf("The number you entered is %d\n", number);
}
else
printf("The number you entered is not a valid integer.\n");
return 0;
}
int isvalidInt(char val[])
{
int start = 0;
int i;
int valid = TRUE;
int sign = FALSE;
/* check for an empty string */
if (val[0] == '\0') valid = FALSE;
/* check for a leading sign */
if (val[0] == '-' || val[0] == '+')
{
sign = TRUE;
start = 1; /* start checking for digits after the sign */
}
/* check that there is at least one character after the sign */
if(sign == TRUE && val[1] == '\0') valid = FALSE;
/*now check the string, which we know has at least one non-sign char */
i = start;
while(valid == TRUE && val[i] != '\0')
{
if (val[i] < '0' || val[i] > '9') /* check for a non-digit */
valid = FALSE;
i++;
}
return valid;
}
优化
#include <stdio.h>
#include <stdlib.h>
int getanInt(); /* function prototype */
int main()
{
int value;
printf("Enter an integer value: ");
value = getanInt();
printf("The integer entered is: %d\n", value);
return 0;
}
#define TRUE 1
#define FALSE 0
#define MAXCHARS 40
int getanInt()
{
int isvalidInt(char []); /* function prototype */
int isanInt = FALSE;
char value[MAXCHARS];
do
{
gets(value);
if (isvalidInt(value) == FALSE)
{
printf("Invalid integer - Please re-enter: ");
continue; /* send control to the do-while expression test */
}
isanInt = TRUE;
}while (isanInt == FALSE);
return (atoi(value)); /* convert to an integer */
}
int isvalidInt(char val[])
{
int start = 0;
int i;
int valid = TRUE;
int sign = FALSE;
/* check for an empty string */
if (val[0] == '\0') valid = FALSE;
/* check for a leading sign */
if (val[0] == '-' || val[0] == '+')
{
sign = TRUE;
start = 1; /* start checking for digits after the sign */
}
/* check that there is at least one character after the sign */
if(sign == TRUE && val[1] == '\0') valid = FALSE;
/*now check the string, which we know has at least one non-sign char */
i = start;
while(valid == TRUE && val[i] != '\0')
{
if (val[i] < '0' || val[i] > '9') /* check for a non-digit */
valid = FALSE;
i++;
}
return valid;
}
*9.4 格式化字符串
print("|% 数字s|")
正数,右对齐
负数,左对齐
9.5 字符和单词计数
字符计数
#include <stdio.h>
#define MAXNUM 1000
int countchar(char []); /* function prototype */
int main()
{
char message[MAXNUM];
int numchar;
printf("\nType in any number of characters: ");
gets(message);
numchar = countchar(message);
printf("The number of characters just entered is %d\n", numchar);
return 0;
}
int countchar(char list[])
{
int i, count = 0;
for(i = 0; list[i] != '\0'; i++)
count++;
return(count);
}
单词计数
#include <stdio.h>
#define MAXNUM 1000
int countword(char []); /* function prototype */
int main()
{
char message[MAXNUM];
int numchar;
printf("\nType in any number of words: ");
gets(message);
numchar = countword(message);
printf("The number of words just entered is %d\n", numchar);
return 0;
}
int countword(char list[])
#define YES 1
#define NO 0
{
int i, inaword, count = 0;
inaword = NO;
for(i = 0; list[i] != '\0'; i++)
{
if (list[i] == ' ')
inaword = NO;
else if (inaword == NO)
{
inaword = YES;
count++;
}
}
return(count);
}
网友评论