#include <stdio.h>
#include <string.h>
#define max 50
#define len 30
char text[max][len];
void main(){
register int i;
printf("Enter an empty line to quit\n");
for(i =0 ;i<max;i++){
gets(text[i]);
if (!*text[i]){break;}
}
puts(text[1][0]);/*I want to display first character of second string but it doesn't print anything. Why??*/
}
как получить доступ к символу или части строки из массива строк
Измените puts()
на putchar()
, чтобы напечатать один символ.
В вашем коде puts(text[1][0])
пытается напечатать text[1][0]
, который является char
, а puts
принимает только char*
, что приводит к ошибке сегментации на моем компьютере.
Но printf
позволяет напечатать char
.
Фиксированный код:
#include <stdio.h>
#include <string.h>
#define max 50
#define len 30
char text[max][len];
void main(){
register int i;
printf("Enter an empty line to quit\n");
for(i =0 ;i<max;i++){
gets(text[i]);
if (!*text[i]){break;}
}
printf("%c\n", text[1][0]); /* printf allows you to print char */
}
Примечание: как сказано в комментариях к вопросу, вы также можете использовать putchar()
для печати одного символа.
Вход:
s
s
Выход:
s
Для начала по стандарту C функция main
без параметров должна быть объявлена как
int main( void )
Функция gets
небезопасна и не поддерживается стандартом C. Вместо этого используйте стандартную функцию C fgets
.
Функция puts
ожидает аргумент типа указателя char *
, указывающего на строку. Однако вы передаете объект типа char
puts(text[1][0]);
который вызывает неопределенное поведение.
Также объявляйте переменные в минимальной области видимости, где они используются. Нет большого смысла объявлять массив text
в области видимости файла.
Программа может выглядеть следующим образом
#include <stdio.h>
#define MAX 50
#define LEN 30
int main( void )
{
char text[MAX][LEN] = { 0 };
puts( "Enter an empty line to quit" );
size_t i = 0;
while ( i < MAX && fgets( text[i], LEN, stdin ) != NULL && text[i][0] != '\n' )
{
++i;
}
if ( !( i < 2 ) ) printf( "%c\n", text[1][0] );
}
Обратите внимание, что функция fgets
может хранить символ новой строки '\n'
в дополненном массиве.
Если вы хотите удалить его, вы можете написать, например
#include <string.h>
//...
text[i][ strcspn( text[i], "\n" ) ] = '\0';
Никогда не используйте
gets
. Он был удален из языка в C11, потому что это небезопасно. Вместо этого используйтеfgets
.