2016-09-01 2 views
1

Я делаю визуальный дисплей для указателей, используя таблицу. Первый вход для length работает, но mychars не читается. Я знаю, что есть новая строка после scanf, но я не знаю, как она себя ведет. Как mycharsscanf разобран в моем конкретном случае?scanf not reading mychars

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

int main() { 
    int length; 
    printf("Length? "); 
    scanf("%d", &length); 

    char *mychars = (char *)calloc(length, sizeof(char)); 

    printf("mychars? "); 
    scanf("%[^\n]s", mychars); 
    printf("mychars is \"%s\"\n", mychars); 
    printf("pointer at %p\n", mychars); 
    if (strlen(mychars) == length) { 
     printf("Address Location  Value\n"); 
     int i; 
     for (i = 0; i < length; i++) { 
      printf("%-10p *(mychars+%02d) %3c\n", (mychars+i), i, *(mychars+i)); 
     } 
    } else { 
     print("Not right length"); 
    } 
    free(mychars); 
    return 0; 
} 
+0

Что вы подразумеваете под переменной «не работает»? –

+0

@ пользователь3121023 спасибо. Почему это работает? –

+1

BTW: как вы проверяете, что 'length' и длина ввода от' scanf ("% [^ \ n] s", mychars); 'fit? – deamentiaemundi

ответ

1

Не использовать scanf(). Это зло. Он плохо справляется с проблемами и легко для учащихся использовать их неправильно. Используйте fgets().

// untested code 
int main(void) { 
    size_t length; // Use size_t for array sizes 
    printf("Length? "); 
    fflush(stdout); // Insure prompt is displayed before input. 

    char buf[50]; 
    if (fgets(buf, sizeof buf, stdin) == NULL) return -1; 
    if (sscanf(buf, "%zu", &length) != 1) return -1; 

    char *mychars = malloc(length + 2); // +1 for \n, +1 for \0 
    if (mychars == NULL) return -1; 

    printf("mychars? "); 
    fflush(stdout); 
    if (fgets(mychars, length + 2, stdin) == NULL) return -1; 
    // lop off potential \n 
    mychars[strcspn(mychars, "\n")] = 0; 

    printf("mychars is \"%s\"\n", mychars); 
    printf("pointer at %p\n", (void*) mychars); // Use `void *` with %p 

    if (strlen(mychars) == length) { 
    printf("Address Location  Value\n"); 
    size_t i; 
    for (i = 0; i < length; i++) { 
     printf("%-10p *(mychars+%02zu) %3c\n", (void*) (mychars + i), i, *(mychars + i)); 
    } 
    } else { 
    printf("Not right length\n"); // add \n 
    } 
    free(mychars); 
    return 0; 
} 
+0

Я не уверен, что понимаю ваш высокоуровневый код, и он не работает совершенно правильно. Это то, что я получаю: $ runc.py newstat удаление "newstat.exe" удален компиляция Скомпилировано! Площадь застройки ---------------------------------------------- ---- Длина? 10 ----------------------------------------------- --- Нажмите любую клавишу, чтобы продолжить. , , –

+1

@ Clayton Wahlstrom 1) Пройдите код. 2) Код, вероятно, выходит из одного из 'return -1;' 3) Подозреваемый вы используете несоответствующий C-компилятор, который имеет проблемы с ''% zu'' - изменить на ''% u'' и использовать тип 'unsigned', а не' size_t'. – chux

+1

@ClaytonWahlstrom Ну, [проверено] (https://ideone.com/VJ7Nr9) (вам нужно добавить 'f' только к последнему' print (... '), и он« работает », как ожидалось. –