Сохранять строки в массив строк с помощью scanf - PullRequest
0 голосов
/ 07 февраля 2019

Попытка сохранить ввод в массив строк со следующим кодом:

#include <stdio.h>
#include <string.h>
int main()
{
    int noOfStrings;
    printf("Enter no of strings: ");
    scanf("%d", &noOfStrings);
    char *string[noOfStrings];
    for(int i=0; i<noOfStrings; i++){
        printf("\nEnter string %d: ", i);
        scanf("%s\n",string[i]);
    }
    return 0;
}
-----------------------------------------------------------------------------
Console:
Enter no of strings: 3                                                                                                   

Enter string 0: abc                                                                                                      

Enter string 1: def                                                                                                      

Enter string 2: ghi                                                                                                      

Segmentation fault (core dumped)                                                                                         


...Program finished with exit code 139                                                                                   
Press ENTER to exit console.
-----------------------------------------------------------------------------

Я не могу понять, почему это не удается.

Я также пробовал следующий код с фиксированным размероммассив.

#include <stdio.h>
#include <string.h>
int main()
{
    int noOfStrings;
    printf("Enter no of strings: ");
    scanf("%d", &noOfStrings);
    char string[noOfStrings][5];
    for(int i=0; i<noOfStrings; i++){
        printf("\nEnter string %d: ", i);
        scanf("%s\n",string[i]);
    }
    printf("\nPrinting Stored Strings");
    for(int i=0; i<noOfStrings; i++){
        printf("\nEnter string %d: ", i);
        printf("%s\n",string[i]);
    }
    return 0;
}
-----------------------------------------------------------------------------
Console:
Enter no of strings: 3                                                                                                 

Enter string 0: abc                                                                                                    
def                                                                                                                    

Enter string 1: ghi                                                                                                    

Enter string 2: jkl                                                                                                    

Printing Stored Strings                                                                                                
Enter string 0: abc

Enter string 1: def                                                                                                    

Enter string 2: ghi                                                                                                    


...Program finished with exit code 0                                                                                   
Press ENTER to exit console. 

После ввода 1-й строки ('abc') Не было приглашения для 2-й строки, поэтому продолжил ввод 'def'.Далее следуют еще 2 строки.Обратите внимание, что строка 'jkl' не печатается.

Скажите, пожалуйста, что мне не хватает в этих 2 случаях?

Спасибо.

1 Ответ

0 голосов
/ 07 февраля 2019

В первом случае вы определяете массив указателей:

char *string[noOfStrings];

Однако эти указатели неинициализированы.Когда вы пытаетесь использовать scanf, вы разыменовываете эти недействительные указатели.Это вызывает неопределенное поведение , что в данном случае приводит к сбою.

Во втором случае это исправляется с помощью двумерного массива символов, достаточно большого для хранения введенных вами строк.Но вы застряли из-за вашего scanf формата:

scanf("%s\n",string[i]);

\n в строке формата соответствует любому количеству пробельных символов , поэтому функция не вернется, покаВы вводите непробельный символ.Вы можете исправить это, удалив \n из строки формата.

scanf("%s",string[i]);
...