user1371943
user1371943

Reputation:

Static array and dynamic array

char a[10];
scanf("%s",a);
int i=0;
while(a[i]!='\0')
     printf("\n%c",a[i++]);  //similar to printf("%s",a);               


char *b;
b=malloc(10*sizeof(char));
scanf("%s",b);
i=0;
while((b+i)!='\0')
     printf("\n%c",*(b+i++));   //not similar to printf("%s",a);

For input "abcd", the first loop prints a[] is it would be with printf(). But the same is not true for *b.

Second loops continues for too many until it encounters a '\0'.

So, does this mean '\0' is appended at the end of character strings automatically but not at the end of char type pointers?

And whose job is it to append this '\0'? Compiler's?

Upvotes: 1

Views: 994

Answers (2)

Cloud
Cloud

Reputation: 19333

Dereferencing issue.

In the line (b+i) should be replaced with either:

*(b+i)

or

b[i]

Additionally, if you are just taking in strings, you should consider using fgets() instead of scanf, as it can help you avoid the user typing in too many characters and crashing your program.

Finally, you might consider using calloc() instead of malloc() as it automatically sets the contents of the array you allocate to be all-zeros rather than random garbage.

As an example:

#include <stdio.h>
#define MAX_BUFFER_LENGTH
int main(void) {
  char a[MAX_BUFFER_LENGTH];
  char *b;
  fgets(a,MAX_BUFFER_LENGTH,stdin);
  int i=0;
  while(a[i]!='\0') {
     printf("\n%c",a[i++]);
  }

  b=calloc(MAX_BUFFER_LENGTH,sizeof(char));
  fgets(b,MAX_BUFFER_LENGTH,stdin);
  i=0;
  while(*(b+i)!='\0') {
    printf("\n%c",*(b+i++));
  }
  // Done
  return 0;
}

This is a much safer way to approach the problem you are solving.

Good luck!

Upvotes: 1

Seth Carnegie
Seth Carnegie

Reputation: 75130

You forgot to dereference the pointer you get with b+i. It should be:

while (*(b + i) != '\0') // or while (b[i] != '\0') or while(b[i])

b + i just gets you an address, you have to dereference it to actually look at what the memory is pointing at and see if it's the NUL-terminator. The x[y] notation is equivalent to *(x + y).

Also don't forget to free the memory you allocated with malloc.

Upvotes: 7

Related Questions