LuisP
LuisP

Reputation: 1

How to de-allocate an array of characters in c?

I'm writing a program that asks the number of strings which i'll then count how many spaces it has. My problem is when I start a new cycle I can't allocate the array of characters I use to count the spaces. Thanks in advance.

#include <stdio.h>
#include <string.h>
int main(){
    char a[20];
    int x, z, esp=0, num;
    scanf("%d\n", &num);
    
    int array[num];
    
    for (int i=0;i<num;i++){
       
        scanf("%[^\n]", &a);
    
        z =strlen(a);
    
        for (x=0; x<=z; x++){
            if (a[x] == ' '){
            
                esp++;
            } 
        }
        array[i] = esp;
        esp =0;
        
    }
    
    for (int i=0;i<num;i++){
        printf ("%d\n", array[i]);
    }
return 0;
}

Upvotes: 0

Views: 87

Answers (3)

LuisP
LuisP

Reputation: 1

Thanks to everyone who commented and answered my question, I think I wasn't able to explain myself properly. It's a code which reads a number, the number of the lines of characters which then it'll count the spaces of; my problem started when the code executes a new cycle in which this scanf didn't let me enter the string of characters again: scanf("%[^\n]", &a), but did everything else in the cycle while using the same string. I'm really new to this, coding and the page itself so thanks for the advices. I was able to find a solution: scanf("%[^\n]%*c, &a)

  • %*[^\n] scans everything until a \n, but doesn't scan in the \n. The asterisk(*) tells it to discard whatever was scanned.
  • %*c scans a single character, which will be the \n left over by %*[^\n] in this case. The asterisk instructs scanf to discard the scanned character.

And here is the updated code:

#include <stdio.h>
#include <string.h>
int main(){
    char a[20];
    int x, z, esp=0, num;
    scanf("%d\n", &num);
    
    int array[num];
    
    for (int i=0;i<num;i++){
       
        scanf("%[^\n]%*c", &a);
    
        z =strlen(a);
    
        for (x=0; x<=z; x++){
            if (a[x] == ' '){
            
                esp++;
            } 
        }
        array[i] = esp;
        esp =0;
        
    }
    
    for (int i=0;i<num;i++){
        printf ("%d\n", array[i]);
    }
return 0;
}

Upvotes: 0

chux
chux

Reputation: 154312

Problems:

  • Not having all warnings enabled. Save time, enable them all.

  • '\n' blocks for more input in scanf("%d\n", &num);

  • Not checking scanf() return value.

  • Not limiting input with a width in scanf("%[^\n]", &a);

  • Wrong type passed in scanf("%[^\n]", &a);

  • Big one: not consuming the end-of-line with repeated scanf("%[^\n]", &a); calls.

  • Perhaps more.

Repaired code:

// scanf("%d\n", &num);
if (scanf("%d", &num) != 1) {  // '\n' removed
  puts("Error1");
  return -1;
}


    // scanf("%[^\n]", &a);
    if (scanf(" %19[^\n]", a) != 1) {  // ' ' consumes white-space like \n
      puts("Error2");
      return -1;
    }

Upvotes: 1

user6094307
user6094307

Reputation:

On the first scanf, remove \n character, after the first scanf, add getchar() to consume new line character. Replace second scanf with gets;

Then it will work correctly.

By the way, since gets is unsafe, you can use fgets with stdin parameter and max character count parameter instead of gets.

Upvotes: 0

Related Questions