C语言空字符串的问题;

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言空字符串的问题;相关的知识,希望对你有一定的参考价值。

#include <stdio.h>
#include <string.h>
main()

int i;
//char str[100]; 这样是可以;
char str[]="";//这里只能出前一个单词,后面就是问号了;因为比如现实中,你不可能知道一个字符串有多长,所以想让它自动增加长度,但不知道方法;
gets (str);
for (i=0;str[i]!='\0';i++)
if(isspace(str[i-1]))
str[i]=str[i]-32;
else if(i==0)
str[i]-=32;
else if (isupper (str[i]))
str[i]+=32;
puts(str);

//本个程序是转换大小写,但这个不是重点;

一、

空字符在c语言中空字符用’\0’表示。
‘\0’对应的整型值是0,所以给一个字符变量赋值为空字符时,以下两种都是可以的:

char ch='\0';
char ch=0;
1
2
二、

今天在阅读源代码的过程中遇到了一个字符串操作:
s[i] = ‘\0’
当时感觉很奇怪,为什么要将一个位置的字符赋值为空字符串’\0’。原来空字符在C语言中是个很特殊的字符。主要体现在字符串中。

字符串
字符串就是一串零个或多个字符,并且以位模式为全0的NUL字节即空字符(‘\0’)结尾。C语言中字符串没有显示的数据类型,字符串通常存储在字符数组或动态分配的内存中,在编码操作中通常将整个字符串作为操作对象,常用操作包括复制、查找、比较等。

空字符与字符串
1、空字符是字符串的终止符。注:空字符本身不是字符串的一部分,所以字符串的长度并不包含空字符;
2、操作字符串时,必须保证字符串以空字符结尾(注:不以空字符结尾的字符序列,不是字符串)。

所以那句代码的意思是将位置i以后的字符截断丢弃,起到分割字符串的作用。

趁此机会,将与空字符有关的知识梳理一遍:

如果在一个需要字符串的地方(例如strlen函数的参数)使用了一个不是以空字符结尾的字符序列,会造成什么结果呢?
a、strlen函数将无法知道空字符是没有的,所以它将继续进行查找,一个接一个字符查找直到发现一个空字符为止,或许它找几百个字符才找到,而此时strlen函数的这个返回值从本质上说是一个随机数或者说并没有实际意义;
b、如果字符串操作函数试图访问了系统分配给这个程序以外的内存范围,程序会崩溃(通常表现为段溢出,程序异常退出)。
第二部分转载自第一个链接,未完全转载。
参考技术A 你那越界了。
在定义的时候,char str[100]; 是指定了数组大小100个字符。
但是如果写,char str[]="";就是是将数组的大小和值定义成和字符串常量“”相同,而这里“”是空字符串。str就一个字符大小,里面存放的是结束符号0,所以后面你输入字符串给str,里面存放了第一个字符,而其他字符都存到越界的地址中。
想要定义不定长的数组。
只要使用malloc函数申请就可以了。
定义指针char *str=(char *)malloc(sizeof(char)*n);这里n就是你要的字符长度。
记得在第一次使用时判断一下str是否为NULL(NULL说明异常,应该终止程序)。本回答被提问者采纳
参考技术B 用malloc或者calloc动态内存分配。随便一本C语言书上都有动态内存分配这一章的,你可以查一下。或者百度下也能了解。
可以while循环用getchar()读取每个字符存入变量中,读一个往一个字符串指针动态内存分配空间,再往后面加上那个字符。直到读取到\0,存入\0再跳出循环。
楼下说要用到链表的才是多此一举吧,还踩我?
参考技术C 按照你的题意,这种事先不给出字符串的最大长度,随机输入后存储,再进行处理,仅用动态分配个数组是解决不了的,需要用到链表。追答

相关算法参见https://blog.csdn.net/qq_37924510/article/details/71330874

C语言--编程实现字符串中子串的查找

编程实现字符串中子串的查找

 1 #include <stdio.h>
 2 #include <assert.h>
 3 //查找字符串中的某个字符串的位置 
 4 const char *strstr(const char* src,const char* sub)
 5 
 6     const char *bp;
 7     const char *sp;
 8     if(src==NULL || NULL==sub)//判断src与sub的有效性
 9     
10         return src;
11     
12     while(*src)//遍历src字符串
13     
14         bp=src;//用于src的遍历
15         sp=sub;//用于sub的遍历
16         do
17                     //遍历sub字符串
18             if(!*sp)//如果到了sub字符串结束符位置
19                 return src;//表示找到了sub字符串,退出
20         while(*bp++ == *sp++);
21         src += 1;
22     
23     return NULL;
24 
25 
26 int main()
27 
28     char p[] = "12345";
29     char q[] = "34";
30     char *r = strstr(p,q);
31     printf("r:%s\n",r);
32     
33     return 0;
34 

程序运行结果:

r:345

以上是关于C语言空字符串的问题;的主要内容,如果未能解决你的问题,请参考以下文章

用C语言实现 原字符串中指定的子串的的查找与替换代码?注:一定要有用户自己输入指定子串的那个过程!

C语言数据结构(大话数据结构——笔记3)第五章:串(字符串)

c语言程序 输入一字符串存入数组中,逆序存放并输出

字符串之KMP算法求解next数组(C语言)

C语言数据结构与算法--------串全面总结

求出子串(模式串)的next函数值,利用kmp算法实现模式与主串的匹配算法