Сканирование многомерной строки с пробелом в c - PullRequest
0 голосов
/ 15 марта 2020

Я пытаюсь сделать простой ваучер. Итак, я использовал многомерную строку. Но столкнуться с проблемой, включая пространство в этих строках. Вместо этого я взял слова в качестве ввода. Но есть ли способ включить пространство? Мой код указан ниже -

#include<stdio.h>
#include<string.h>

int main(){

    int sum =0, n, i;
    puts("Please input how many transactions you want to enlist: ");
    scanf("%d", &n);
    char list[301][51];
    int amount[301];
    puts("Please enter the name of your transaction and the amount: (Press space or enter to toggle between name and amount . And avoid using spaces in the name; use underscore instead.)");
    for(i=0; i<n; i++){

        scanf("%s %d", &list[i], &amount[i]);
        sum += amount[i];
    }
    list[0][n+1] = '\0';
    amount[n+1] = '\0';
    puts("");
    printf("\t\t\t\t Voucher\n\n");
    puts("  Ser.|\t Name \t\t\t\t\t\t\t|Amount");
    puts("------------------------------------------------------------------------------------------------------------");
    for(i=0; i<n; i++ ){
        printf("  %03d |\t %-50s\t|%6d\n", i+1, list[i], amount[i]);
    }
    puts("------------------------------------------------------------------------------------------------------------");
    printf("      |  Total\t\t\t\t\t\t\t|%6d", sum);
    puts("");
    return 0;
}

1 Ответ

1 голос
/ 15 марта 2020

Для этого вы можете использовать спецификатор %[ scanf, чтобы прочитать все символы до тех пор, пока вы не нажмете ди git, и записать его в list[i].

Это оставит вас с завершающим пробелом в list[i], но его можно обрезать, если вы этого не хотите.

Вызов scanf может выглядеть примерно так:

scanf(" %50[^0-9]%d", list[i], &amount[i]);

Обратите внимание на начальный пробел в строке формата, чтобы указать scanf пропускать пробел (как перевод строки из предыдущей строки), и спецификатор ширины, чтобы не читать больше, чем может поместиться в line[i].

Конечно, это мешает вам иметь числа внутри строки, которую вы читаете. Чтобы решить эту проблему, вам нужно go более сложный маршрут.

Например, прочитав всю строку в буфер, а затем найти последний пробел в строке. Затем вы можете скопировать содержимое перед последним пробелом в list[i] и преобразовать содержимое после в int значение для amount[i].

...