[英]Segmentation Fault- C programming
該程序應該讀取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
您尚未為string
元素分配內存。 為此分配內存。
for(int i = 0; i < 10; i++)
strings[i] = malloc(100);
最后,不要忘記使用free
釋放已分配的內存。
for(int i = 0; i < 10; i++)
free(string[i]);
未為字符串變量string
分配內存。 您只聲明了指向10個字符串的指針
char *strings[10];
字符串數組或變量沒有內存,因此您必須分配它
for(i=0;i<10;i++) {
string[i]=malloc((max_length_of_string));
}
您可以將max_length_of_string
設為100。
通過以下方式定義數組
char strings[10][100];
另外此代碼段不正確
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
其中一些問題可能超出了您項目的范圍。
fgets()
。 fgets()
的問題,包括在結果字符串末尾輸入的換行符。 strings[i][len]
時,您會不正確地使用strings[len]
strings[i][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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.