2015-03-25 2 views
0

Прежде всего, я понимаю, что это может быть новичок, но я только начинаю. Пожалуйста, постарайся быть терпеливым. Я хочу сделать функцию, которая должна суммировать все числа, прежде чем найти номер «0». . «1230» должен возвращать «6». Но я не понимаю, как сканировать целочисленный массив. Это мой код, и компилятор говорит «ошибка сегмента (ядро сбрасывали). Что случилось?Массив целых цепей

#include <stdio.h> 

int main(){ 
    int sum, i, x[1000]; 
    printf("Insert a number"); 
    scanf("%d", &x[i]); 
    sum=0; 

    for (i=0; x[i]!='0'; i++) 
     sum=sum+x[i]; 

    printf("%d", sum); 
    return 0; 
} 
+0

Похоже, что вы должны читать в строке, а затем итерации по символам в этой строке, конвертируя их по ходу. Это также имеет то преимущество, что не ограничивается размером целого числа c (32767) –

+0

@ SimonMᶜKenzie Хорошая точка. – DigitalNinja

+0

всегда нужно проверить возвращаемое значение из scanf (и семейства), чтобы убедиться, что операция прошла успешно. Однако использование fgets() или getline() приведет к тому, что весь вход будет представлен как массив символов, завершенный символом новой строки, а затем «\ 0». Новая строка может быть проигнорирована в коде и итерации по массиву символов до тех пор, пока текущий символ «\ 0» не предложит изучить, как символы и целочисленные значения хранятся в памяти. – user3629249

ответ

0

„0“является char, не целое число. Вы должны написать x[i]!=0

однако char может быть автоматически преобразованы в int, поэтому компилировать OK ... но «0» преобразуется в ASCII-код, так что ваша программа равна x[i]!=48

и вы должны проверить границы массива, чтобы избежать ошибок, если 0 не существует в массиве. должно быть rite i<1000 && x[i]!=0

РЕДАКТИРОВАТЬ: ваше сканирование также неверно, что scanf может принимать только одно число, и я не был назначен. Полагаю, вы хотели сканировать целую строку и просто добавить цифру по цифре. Затем вы должны использовать char и написать так:

int sum, i; 
char x[1000]; 
scanf("%s", x); 
for(int i=0; i<1000 && x[i]>'0' && x[i]<='9'; i++) 
sum += (x[i] - '0'); 
+0

Он компилируется, но когда я вставляю номер, он возвращает странное огромное число. Я предположил printf («% d», sum) в конце кода. Что не так? –

+0

ли вы забыли 'sum = 0'? Я просто не писал его дубликат – Cherry

+0

Я сделал. Теперь он работает правильно. Просто скажи мне что-нибудь. (x [i] - '0') преобразуется из ASCII в int, правильно? –

0

Простейшим является чтение одного символа в то время. Если ничего другого, это позволяет избежать переполнения буфера.

#include <stdio.h> 

int main(void) { 
    int sum=0, i; 
    while ((i = getchar()) && i > '0' && i <= '9') sum += i - '0'; 
    printf("%d\n", sum); 
    return 0; 
} 
0

вы должны использовать инструкцию scanf() в цикле.

и причина, по которой ваш код дает ошибку сегментации, является переменной «i» неинициализирован. локальная неинициализированная переменная будет содержать значения мусора. с «i», имеющим какую-либо ценность для мусора, ваша программа пытается записать в ячейку памяти, которая находится за пределами вашего пользовательского пространства.

Смежные вопросы