您的位置:首页 > 其它

Standard C Episode 6

2015-08-18 03:02 323 查看
字符串。字符串是以'\0'结尾的字符序列。C语言字符串在内存中的存储规则:按照串中字符出现的顺序在内存中连续存储,末尾是字符串结束符'\0'。

注:'\0'(查ASCII码表可知'\0'就是0)是表示字符串的字符,它的位置决定了一个字符串中有效字符的个数。

字符串常量。字符串常量在源程序词法记号中属于"文字",它和其他文字"数字、布尔文字、以及字符"一样。但区别是“字符串常量文字代表的是首字符地址”。

注:编译器编译时候会把源程序中重复出现的相同文字只存储一回。多个连续的字符串也会被当做一个字符串处理。例如源程序中的"abcd""efg"就被编译器在编译时认定为字符串"abcdefg"

/*
* 字符串练习
*
* C语言标准库函数printf()提供了简单的字符串输出方法。具体地,printf()将从指定地址开始输出字符直到发现字符串结束符'\0'
* */

#include <stdio.h>

int main()
{
char *p_str = "abc";/*
C语言用字符串的首字符的地址代表一个字符串。也就是说"abc"被处理为一个地址。字符串始于该地址止于字符串结束符'\0'
*/
printf("\"abc\"按照十六进制数输出是0x%X\n", "abc");
printf("\"abc\"按地址数据格式输出是0x%p\n", "abc");
printf("%c\n", *p_str);
printf("%s\n", p_str);//与格式化字符串中占位符%s对应的实参应该是一个字符串的地址

char ch = 'x';
p_str = &ch;
printf("%s\n", p_str);//printf执行输出过程中将从p_str给出的地址开始输出字符直到发现'\0'为止。显然我们不清楚什么时候才能发现'\0',这是危险的。

return 0;
}


/*
* 字符串练习
* */

#include <stdio.h>

int main()
{
char *p_str = "abcdef";
//*p_str = 'x';//字符串"abcdef"是字符串常量,是词法记号中所称的文字。不可以修改。此语句编译无错误,运行则会导致操作系统终止程序报告段错误。
printf("%p\n", "abcdef");
printf("p_str是%p\n", p_str);//打印结果同于printf("%p\n", "abcdef");因为编译器编译时将相同文字只存储一次。
printf("%s\n", "abcde""fg");

char str[] = "abc";
//char str[3] = "abc";//数组长度不够,字符串结束符'\0'无法存放,编译器gcc编译不报错,字符串结束符'\0'被编译器舍弃
char str1[] = {'a', 'b', 'c'};//字符数组str1只是一个字符数组,不是一个有效的字符串
char str2[] = {'a', 'b', 'c', '\0'};//字符数组str2就是一个有效的字符串
printf("%s\n", str);
printf("%s\n", str1);//printf执行输出从str1给出的地址开始输出字符直到发现'\0'为止。显然我们不清楚什么时候才能发现'\0',这是危险的。
printf("%s\n", str2);
printf("字符数组str[]的元素个数是%d\n", sizeof(str) / sizeof(str[0]));
str[0] = 'Y';
str[1] = 0;
printf("%s\n", str);

}


/*
* 字符串输入
* 标准库函数scanf() 和 fgets()可以用来从键盘读取字符串
* fgets()通过指定参数避免了出现字符数组溢出问题。
*
*
* */

#include <stdio.h>
#define N    10
main()
{
char buf
;
//scanf("%s", buf);
fgets(buf, 10, stdin);//从stdin读入9个字符放入buf,然后继续放入字符串结束符
printf("%s\n", buf);
}


/*
* 字符处理函数练习
* strlen()练习
*
*
* */
#include <string.h>
#include <stdio.h>

int main()
{
char ch[] = "abc";
printf("字符串\"abc\"有%d个字符\n", strlen("abc"));
printf("字符串ch有%d个字符\n", strlen(ch));

return 0;
}


/*
* 字符串处理标准库函数练习
*
* strcat(), strncat()练习
*
* strcat合并字符串容易导致字符串数组溢出,用strncat可以用个参数有效防止字符串数组溢出
* */

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

main()
{
char str1[20] = "abc";
printf("str1字符串长度为%d\n", strlen(str1));
strcat(str1, "xyz");
printf("合并字符串\"xyz\"到字符串str1之后,字符串长度为%d\n", strlen(str1));

}


/*
* 字符串处理标准库函数练习
*
* strcpy(), strncpy()练习
*
* strcpy复制时候容易导致目标字符数组溢出,strncpy则可以通过参数防止溢出
*
* */

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

main()
{
char str1[20] = "abcefg";
printf("str1是%s\n", str1);
strcpy(str1, "xyz");
printf("复制字符串\"xyz\"到字符串str1之后,字符串长度为%d\n", strlen(str1));
printf("str1是%s\n", str1);

}


/*
* 字符串处理标准库函数练习
* 比较两个字符串大小(ASCII码大的字符大于ASCII码小的字符)
*
* strcmp(), strncmp()练习
* strncmp()可以实现比较两个字符串的前n个字符大小
* */

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

main()
{
char str1[20] = "abcefg";
char str2[] = "ABC";
printf("str1是%s\n", str1);
printf("str2是%s\n", str2);
printf("strcmp(str1, str2)是%d\n", strcmp(str1, str2));

}


/*
* 文件名:string.h
* 描述:字符串处理函数练习
*
*       (1) int strcmp(const char *s1, const char *s2)   //compare two strings
*           int strncmp(const char *s1, const char *s2, size_t n)
*
*       (2) char * strcat(char *dest, const char *src) //concatenate tow strings
*           char * strncat(char *dest, const char *src, size_t n)
*
*       (3) char * strcpy(char *dest, const char *src) //copy  a string
*           char * strcpy(char *dest, const char *src, size_t n)
*
*       (4) size_t strlen(const char *s) //calculate the length of a string
*
*
*
* */
#include <stdio.h>
#include <string.h>

int main()
{
char str[] = "i love you" "chen xin";
char tmp[100] = {0};

printf("%s\n", str);
if (strcmp(str, "i love you chen xin") != 0) {
strncpy(tmp, str, 10);
strncat(tmp, " CHEN XIN", 1);//string concatenate
strcpy(str, tmp);
strcat(str, "CHEN XIN");
}

printf("STRING(length %d ): %s\n", strlen(str), str);

printf("strcmp(\"ILOVEYOU\", \"iloveyou\") RETURN %d\n",
strcmp("ILOVEYOU", "iloveyou"));//<0
printf("strcmp(\"iloveyou\", \"iloveyou\") RETURN %d\n",
strcmp("iloveyou", "iloveyou"));//=0
printf("strcmp(\"iloveyou\", \"ILOVEYOU\") RETURN %d\n",
strcmp("iloveyou", "ILOVEYOU"));//>0
printf("tmp=>%s\nstr=>%s\n", tmp, str);
printf("strncmp(tmp, str, 5)=>%d\n", strncmp(tmp, str, 5));

return 0;
}


/*
* Discreption: 从键盘上读入用户名称,读入用户输入的密码;
*                 比较用户名密码是否匹配:
*                 匹配:print登陆成功;
*                 不匹配:print重试,剩余n(n<3)次
*                 当n=3,提示登陆失败
*
* */

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

#define N    10
int check_user(char str1[], char str2[]);

main()
{
char name
= {0};
char pw
= {0};
unsigned retry = 0;
unsigned times = 3;
do {
printf("用户名:");
scanf("%s", name);
printf("密码:");
scanf("%s", pw);
if (!strcmp(name, "admin") && !strcmp(pw, "123456")) {
printf("登陆成功.\n");
retry = 0;
}
else
{
retry = 1;
times--;
printf("用户名/密码错误,还可以尝试%d次.\n", times);
}
} while (times > 0 && retry);
}


/*
带参数的main函数
*/

#include <stdio.h>
int main(int argc, char *argv[])
{
int loop = 0;
for (loop = 0; loop < argc; loop++) {
printf("%s\t", argv[loop]);
}
printf("\n");

for (loop = 0; loop < argc; loop++) {
printf("%s\t", *(argv + loop));
}
printf("\n");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: