循环通过C中的字符串会导致分段错误(内核转储)
对于下面的代码,我得到循环通过C中的字符串会导致分段错误(内核转储),c,segmentation-fault,C,Segmentation Fault,对于下面的代码,我得到 Segmentation fault (core dumped) 错误信息,有人能帮我吗 #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void){ char s[] = "helloWorld"; int i; for(i = 1; i < strlen(s); i++) { pri
Segmentation fault (core dumped)
错误信息,有人能帮我吗
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void){
char s[] = "helloWorld";
int i;
for(i = 1; i < strlen(s); i++)
{
printf("Letter is %s\n", s[i]);
}
return(0);
}
#包括
#包括
#包括
内部主(空){
字符s[]=“helloWorld”;
int i;
对于(i=1;i
是错误的,%s
需要一个常量字符*
,而您给它一个字符
。把这行改成
printf("Letter is %c\n", s[i]);
因为%c
格式说明符用于打印单个字符
另外,在C语言中,数组是基于零的,因此应该使用i=0将i
初始化为零代码>也是
是错误的,%s
需要一个常量字符*
,而您给它一个字符
。把这行改成
printf("Letter is %c\n", s[i]);
因为%c
格式说明符用于打印单个字符
另外,在C语言中,数组是基于零的,因此应该使用i=0将i
初始化为零代码>。您正在逐字符打印,因此请使用%c
而不是%s
%s
需要一个字符串,但s[i]
实际上是一个字符
同样,每次您拨打strlen
。strlenstrlen
不会改变,所以最好使用一个变量,在进入循环之前只调用一次
更优化的方式如下:
int len=strlen(s);
for(i = 0; i < len; i++)
{
printf("Letter is %c\n", s[i]);
}
int len=strlen;
对于(i=0;i
您正在逐字符打印,因此请使用%c
而不是%s
%s
需要一个字符串,但s[i]
实际上是一个字符
同样,每次您拨打strlen
。strlenstrlen
不会改变,所以最好使用一个变量,在进入循环之前只调用一次
更优化的方式如下:
int len=strlen(s);
for(i = 0; i < len; i++)
{
printf("Letter is %c\n", s[i]);
}
int len=strlen;
对于(i=0;i
不是segfault的原因,但C中的数组是基于零的。循环应该以i=0开始。这不是SEGFULT的原因,但C中的数组是基于零的。您的循环应该以i=0开始。这一优化的要点很好,但很可能编译器还是会成功的。@H2CO3:是的,但最好遵循良好的编程技术。此外,如果您使用gcc进行编译,当使用错误的printf格式时,您会看到一条警告:seg.c:13:9:警告:格式“%s”需要类型为“char*”,但是参数2的类型为“int”,带有这样一个警告,您知道会发生segfault。这一优化很有意义,但编译器很可能会成功。@H2CO3:是的,但最好遵循良好的编程技术。另外,如果您使用gcc编译,当使用错误的printf格式时,您将看到一条警告:seg.c:13:9:警告:格式“%s”要求类型为“char*”,但参数2的类型为“int”,如果有这样的警告,您知道将发生segfault。