Ошибка сегментации при работе со строками - PullRequest
0 голосов
/ 07 августа 2020

Для строки num, состоящей из букв и цифр, найдите частоту каждого di git (0-9) в данной строке.

'' '

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

int main() {

    /* Enter your code here. Read input from STDIN. Print output to STDOUT */ 
    char num[20];
    int i;
    int count[15]={0};
  
    scanf("%s",num);
    

    for(i=0;i<10;i++){
        printf("\n");     
        for(int j=0;j<strlen(num);j++){
            if(isdigit(num[j])){
               if(i == num[j]-'0'){
                count[i]+=1;
            }

            }
           
        }
        printf("\nCount %d:%d",i,count[i]);
    }  

    for(i=0;i<10;i++){
        printf("%d ",count[i]);
    } 
    return 0;
}

'' '

ВЫХОД:

Счетчик 0: 5

Счетчик 1: 9

Счетчик 2: 5

Счетчик 3: 12

Счетчик 4: 8

Счетчик 5: 11

Счетчик 6: 15

Счетчик 7: 4

Счетчик 8: 4

завершено, ошибка сегментации

Почему не работает при проверке, что di git равно 9?

1 Ответ

0 голосов
/ 07 августа 2020

Глядя на ваш вывод, кажется, что вы ввели строку намного длиннее 19 символов. Итак, ваша программа имеет неопределенное поведение.

Это

scanf("%s",num);

- то, что вам никогда не следует делать. Не забудьте ограничить ввод размером вашего буфера. То есть:

char num[20];     // Size of buffer is 20

scanf("%19s",num);
        ^^
        At max allow 19 characters so that there is also room for the string termination

Или, что лучше, используйте fgets вместо scanf. Одним из преимуществ fgets является то, что он принимает размер буфера в качестве аргумента - следовательно, вы никогда не забываете его указать.

Также обратите внимание, что внешний for l oop не нужен. Вы можете обновить массив напрямую, используя один l oop.

// for(i=0;i<10;i++){  Delete this - it's not needed

    for(int j=0;j<strlen(num);j++)
    {
        if(isdigit(num[j]))
        {
            count[num[j]-'0']+=1;  // Update array
        }
    }

BTW: вам нужно всего 10 элементов в счетчике, т.е.

int count[15]={0};   --->  int count[10]={0};
...