今天给各位分享c语言字符串无效的知识,其中也会对c语言为什么没有字符串类型进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
1、c语言字符串输出无效2、c语言问题?字符串不能显示?3、C语言字符串无法输入4、c语言字符串复制失败,segmentation fault ( core dumped)
c语言字符串输出无效
#includestdio.h
void main()
{
char a[]=”I am a boy.”,b[20],*p1,*p2;
int i;
p1=a;
p2=b;
for(;*p1!=’\0′;p1++,p2++)
*p2=*p1;
*p2=’\0′;
//到这里p1 p2已经移动位置了。 都在字符串结尾。 所以不能再用p1 p2输出
printf(“string a is:%s\n”,a);
printf(“string b is:%s\n”,b);
//这样就可以了。 或者 在输出前 再做一次 p1=a p2=b 不过没必要。
printf(“\n”);
}
c语言问题?字符串不能显示?
囧,哥们,这个错误???呵呵for (i=0; strlen(word[i]) !=0; i++); //注意后面有个分号;加上分号就相当于一个空循环,这样的话,就相当于在这个循环内循环,知道遇到一个长度为0的字符创,然后跳出循环,跳出后,word[i]此时长度为0,那么,你输出这个为空的字符串,能看到啥?去掉分号,修改如下:#include “stdio.h”
#include “string.h”void main()
{
int i;
char word[][50]=
{” ***** ******”,
” * * * *”,
” * * *”,
” * * *”,
” * ***”,
” * * * * “,
” * * * *”,
” **** * * “,
” * *”,
“” //此处,你之前加了一个空格符,也就是” “,注意跟””区别开始,前一个字符长度根本不为0,而为1,内容为一个空格符,所以去掉空格符,才能正常跳出循环。
};for (i=0; strlen(word[i]) !=0; i++)
{
printf (“%s\n”,word[i]);
}
}
C语言字符串无法输入
把scanf一行改为:
scanf(“%d%*c”,c[0].a);
作用是把输入数字后面的一个回车符丢弃,防止下一行读到一个“空字符串”。
c语言字符串复制失败,segmentation fault ( core dumped)
一 造成segment fault,产生core dump的可能原因
1.内存访问越界
a) 由于使用错误的下标,导致数组访问越界
b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符
c) 使用strcpy, strcat, sprintf, strcmp, strcasecmp等字符串操作函数,将目标字符串读/写爆。应该使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函数防止读写越界。
2 多线程程序使用了线程不安全的函数。
3 多线程读写的数据未加锁保护。对于会被多个线程同时访问的全局数据,应该注意加锁保护,否则很容易造成core dump
4 非法指针
a) 使用空指针
b) 随意使用指针转换。一个指向一段内存的指针,除非确定这段内存原先就分配为某种结构或类型,或者这种结构或类型的数组,否则不要将它转换为这种结构或类型 的指针,而应该将这段内存拷贝到一个这种结构或类型中,再访问这个结构或类型。这是因为如果这段内存的开始地址不是按照这种结构或类型对齐的,那么访问它 时就很容易因为bus error而core dump.
5 堆栈溢出.不要使用大的局部变量(因为局部变量都分配在栈上),这样容易造成堆栈溢出,破坏系统的栈和堆结构,导致出现莫名其妙的错误。
今天调试程序时遇到了一个问题,当我用GDB调试程序时出现了Segmentation fault,以前没有遇到过,最后查看资料,有点明白了。
出现了Segmentation fault,基本上的原因是,非法的内存访问。
例如数组的越界,在循环操作时循环变量的控制问题,也有字符串拷贝时长度溢出,指针指向了非法的空间,还有就是申明一个指针,但却没有对其初始化,就直接引用,或者没有开辟内存空间就释放内存,所以要检查申请空间时间偶成功。。。
还有那个问题在调试时会有这样的信息:Program terminated with signal SIGSEGV, Segmentation fault.
对于SIGSEGV这个信号,经常会和SIGBUS信号出现在一块,SIGBUS与SIGSEGV信号的一般区别如下:
1) SIGBUS(Bus error)意味着指针所对应的地址是有效地址,但总线不能正常使用该指针。
通常是未对齐的数据访问所致。
2) SIGSEGV(Segment fault)意味着指针所对应的地址是无效地址,没有物理内存对应该地址。
通常导致段错误的几个直接原因:
1、解除引用一个包含非法值的指针。
2、解除引用一个空指针(常常由于从系统程序中返回空指针,并未经检查就使用)。
3、在未得到正确的权限时进行访问。
4、用完了堆栈或堆空间(虚拟内存虽然巨大,但绝非无限)。
关于c语言字符串无效和c语言为什么没有字符串类型的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。