简体   繁体   中英

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;
}

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;
    }

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.

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;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM