分段错误 - C 编程
Posted
技术标签:
【中文标题】分段错误 - C 编程【英文标题】:Segmentation Fault- C programming 【发布时间】:2014-07-10 21:05:55 【问题描述】:这个程序应该读取 10 个字符串并打印以“ed”结尾的字符串,但是即使它编译,在我输入第一个字符串后我仍然遇到分段错误。我已经尝试了一切,但我无法弄清楚为什么。这是我的代码:
#include <stdio.h>
#include <string.h>
int main(void)
//Declaration of array of strings
char *strings[10];
int i = 0;
int len = 0;
//Prompts user to enter 10 strings
printf("Enter 10 strings: \n");
//Loop to read in 10 strings
for( i = 0; i < 10; i++)
fgets(strings[i], 100, stdin);
//Loop to traverse array of strings and print those ending with 'ed'
printf("The strings that end with ed are:\n");
for( i=0; i < 10; i++)
len=strlen(strings[i]);
len=len-1;
if(*strings[len] =='e' && *strings[len-1] =='d')
printf("%s", strings[i]);
return 0;
//End of function main
【问题讨论】:
你的程序将一个未初始化的指针传递给fgets()
。
将char *strings[10]
更改为char strings[10][100]
fgets
应该写信到哪里?你还没有分配任何东西。
strings[i]
在你的循环之前没有被初始化。
char *strings[10] 不声明字符串数组。它只是声明了一个指向 char * 的指针数组,并且您不会将这些指针初始化为有效内存。因此,当您尝试访问字符串 [0] 时,您会出现段错误!
【参考方案1】:
您尚未为 string
元素分配内存。为它分配内存。
for(int i = 0; i < 10; i++)
strings[i] = malloc(100);
最后不要忘记使用free
释放分配的内存。
for(int i = 0; i < 10; i++)
free(string[i]);
【讨论】:
【参考方案2】:没有为字符串变量string
分配内存。你只声明了指向 10 个字符串的指针
char *strings[10];
字符串数组或变量没有内存,因此您必须分配它
for(i=0;i<10;i++)
string[i]=malloc((max_length_of_string));
您可以将max_length_of_string
设为 100。
【讨论】:
【参考方案3】:按以下方式定义数组
char strings[10][100];
另外这段代码sn-p也不正确
for( i=0; i < 10; i++)
len=strlen(strings[i]);
len=len-1;
if(*strings[len] =='e' && *strings[len-1] =='d')
printf("%s", strings[i]);
试试下面的
for( i=0; i < 10; i++)
len=strlen(strings[i]);
if ( len && strings[i][len - 1] == '\n' ) --len;
if ( len > 1 && strings[i][len - 1] =='d' && strings[i][len-2] =='e')
printf("%s", strings[i]);
这是程序外观的示例
#include <stdio.h>
#include <string.h>
int main( void )
//Declaration of array of strings
const size_t N = 10;
const size_t M = 100;
char strings[N][M];
size_t i;
size_t len;
//Prompts user to enter 10 strings
printf( "Enter %u strings: \n", N );
//Loop to read in 10 strings
for ( i = 0; i < N; i++ )
fgets( strings[i], M, stdin );
//Loop to traverse array of strings and print those ending with 'ed'
printf( "The strings that end with ed are:\n" );
for ( i = 0; i < N; i++ )
len = strlen( strings[i] );
if ( len && strings[i][len - 1] == '\n' ) --len;
if ( len > 1 && strings[i][len - 1] =='d' && strings[i][len - 2] =='e' )
printf( "%s", strings[i] );
return 0;
如果输入
apple
room
horse
finished
close
chicken
city
done
success
opened
那么输出将是
finished
opened
【讨论】:
@BLUEPIXY 你确定吗? @VladfromMoscow:是的,因为len
从 2 递减到 1,所以 len - 2
产生一个负索引。
@BLUEPIXY 哦,我弄错了。谢谢。【参考方案4】:
其中一些问题可能超出了您的项目范围。
您没有为字符串分配任何内存。 您将未初始化的指针传递给fgets()
。
您没有充分处理输入字符串过长(超过 99 个字符)的问题。
您没有充分处理输入字符串非常短(少于 2 个字符)的问题。
您没有充分处理输入的数字或字符串少于预期的问题。
您没有充分处理fgets()
的问题,包括结果字符串末尾的输入换行符。
当你的意思是strings[i][len]
时,你不正确地使用strings[len]
。
您正在检查"de"
,而不是按预期检查"ed"
。
以下是解决这些问题的一种可能的解决方案:
int
main (void)
char *strings[10] = , *x;
int i;
size_t len;
puts("Enter 10 strings:");
for (i = 0; i < 10; ++i) getline(&strings[i], &len, stdin);
puts("The strings that end with ed are:");
for (i = 0; i < 10; ++i)
if ((x = strings[i]))
len = strlen(x);
if (x[len-1] == '\n') x[--len] = '\0';
if (len > 1 && strcmp(x + len - 2, "ed") == 0) puts(x);
free(x);
return 0;
【讨论】:
以上是关于分段错误 - C 编程的主要内容,如果未能解决你的问题,请参考以下文章