Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
循环通过C中的字符串会导致分段错误(内核转储)_C_Segmentation Fault - Fatal编程技术网

循环通过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
。strlen
strlen
不会改变,所以最好使用一个变量,在进入循环之前只调用一次

更优化的方式如下:

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
。strlen
strlen
不会改变,所以最好使用一个变量,在进入循环之前只调用一次

更优化的方式如下:

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。