printing characters using array in c language? - arrays

I tried to scan and print the characters of array using below code but input characters are not matching with output characters
#include <stdio.h>
int main() {
char s[10];
int i, n;
printf("enter the value of n:\n");
scanf("%d", &n);
printf("start entering the characters:\n");
for (i = 0; i < n; i++) {
scanf("%c", &s[i]);
}
for (i = 0; i < n; i++) {
printf("%c", s[i]);
}
return 0;
}
OUTPUT
enter the value of n:
5
start entering the characters:
ABCDE(scanf values)
ABCD(printf values)
Can anyone please clarify my doubt why is the output not matching with input

Since you are wanting to read data into a character array with "scanf" you probably could just reference the string identifier instead and simplify things. Following are a few tweaks to your code that still inputs the data and prints it back out.
#include <stdio.h>
#include <string.h>
int main()
{
char s[10];
int i, n;
printf("enter the value of n:\n");
scanf("%d", &n);
printf("start entering the characters:\n");
scanf("%s", s); /* In lieu of using a loop */
if (strlen(s) < n) /* Just in case less characters are entered than was noted */
n = strlen(s);
for (i = 0; i < n; i++)
{
printf("%c", s[i]);
}
printf("\n");
return 0;
}
The program just scans in the complete string instead of a character at a time. Also, I included the "<string.h> file so as to use functions such as "strlen" (get the length of the string) to provide a bit more robustness to the code. Running the program netted the same character set that was entered.
:~/C_Programs/Console/InputOutput/bin/Release$ ./InputOutput
enter the value of n:
7
start entering the characters:
ABCDEFG
ABCDEFG
You might give that a try.
Regards.

Related

How do I read the number of characters from a input in C?

I am trying to read the number of characters including, the spaces.
I use the scanf function to check for chars using %c. Also on a side note, how would I go about storing the input into an array?
#include <stdio.h>
int main(void) {
char n, count= 0;
while (scanf("%c", &n) != EOF) {
count = count+1;
}
printf("%d characters in your input \n", count);
return 0;
}
When I test input (with spaces) such as
abcdefg
it doesn't print anything.
Defining a MAX_CHAR and checking that in loop would protect you against invalid memory write.
Remember that last byte of an array should be left for '\0', if you want to print or use the char array.
#include <stdio.h>
#define MAX_CHAR 100
int main(void) {
char n[MAX_CHAR]={0}, count= 0;
while((count!=MAX_CHAR-1)&&(scanf("%c",&n[count])==1))
{
if((n[count]=='\n')){
n[count]=0;
break;
}
count++;
}
printf("%d characters in your input [%s]\n", count, n);
return 0;
}
scanf does return EOF when it reaches the end of the file. But in order for you to see that happening, you should give your program a file input when you call it like this:
./a.out < input.txt
Inside input.txt you could put any text you want. But if you want to work in the command line, you should read until you find a \n
#include <stdio.h>
int main(void) {
char n, count = 0;
scanf("%c", &n);
while (n != '\n') {
count = count+1;
scanf("%c", &n);
}
printf("%d characters in your input \n", count);
return 0;
}
If you want to store the input in an array, you must know the size of the input (or at least the maximum size possible)
#include <stdio.h>
int main(void) {
char n, count = 0;
char input[100]; //the max input size, in this case, is 100
scanf("%c", &n);
while (n != '\n') {
scanf("%c", &n);
input[count] = n; //using count as the index before incrementing
count = count+1;
}
printf("%d characters in your input \n", count);
return 0;
}
Furthermore, if don't know the size or max size of the input, you'd have to dynamically change the size of the input array. But I think that would be a little advanced for you right now.
Your printf doesn't print anything because runtime doesn't reach to it. Your code looping for ever in while loop
while (scanf("%c", &n) != EOF) {
count = count+1;
}
because scanf won't return EOF in this case

Runtime initialization of character array in C using for loop

While initializing the character array at runtime using for loop statement inside are executed twice like printf function meanwhile character array of 6 size taking only 3 inputs:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main() {
int i = 0;
char name[6];
for (int i = 0; i < 5; ++i)
{
printf("Enter the character in name array");
scanf("%c", &name[i]);
}
printf("%s", name);
return 0;
}
when you define an array of characters ,in the last element of array you should place \0 to terminate string. so you can scan 5 characters as you do ,but you should add \0 at the end of your string.
also you should add space to your scanf like this scanf(" %c", &name[i]); ,otherwise you will take \n as a character of your string after each time you use enter.(that is reason of problem you explained)
look
int main() {
int i = 0;
char name[6];
for (i = 0; i < 5; ++i)
{
printf("Enter the character in name array");
scanf(" %c", &name[i]);
}
name[i] = '\0';
printf("%s", name);
return 0;
}
also note that ,I have removed int i from here for (int i = 0; i < 5; ++i) , otherwise this i would be only visible in for loop block and out side of it, because of int i = 0; \0 would be placed in name[0] ,and string would be lost.
or use scanf("%6s", name) as #Eraklon said in comments.

Using scanf for character input, but the do-while loop wont stop at the null character

I'm completely new to programming (1st term in uni) and I can't keep up with my lecturer. At the moment I'm stuck on this exercise (for much more time than I'm willing to admit). I've tried to find help on the internet (in this site and others as well), but I can't, since our lecturer has us use a very simple form of c. I'm not asking necessarily for a complete answer. I'd really appreaciate even some hints about where I'm on the wrong. I understand that it might be really simple for some, that the question might seem ignorant or stupid and I feel bad for not getting what's wrong, but I need to try to understand.
So, what I'm trying to do is use scanf and a do while loop so the user can input characters in an array. But I don't understand why the loop won't stop when the user presses ENTER. There's more to the code, but I'm trying to take it slowly, step by step. (I'm not allowed to use pointers and getchar etc).
#include <stdio.h>
main()
{
char a[50];
int i;
printf("Give max 50 characters\n");
i=0;
do
{
scanf("%c", &a[i]);
i=i+1;
}
while((i<=50) && (a[i-1]!='\0'));
for(i=0; i<50; i++)
printf("%c", a[i]);
}
There aren't any nul-terminated strings here, but only string arrays.
So, when pressing enter, a[i-1] is \n not \0 (scanf with %c as parameter doesn't nul-terminate the strings, and ENTER is just a non-nul character with code 10 AKA \n)
Then don't print the rest of the string because you'll get junk, just reuse i when printing the string back:
#include <stdio.h>
main()
{
char a[50];
int i;
printf("Give max 50 characters\n");
i=0;
do
{
scanf("%c", &a[i]);
i=i+1;
}
while((i<sizeof(a)) && (a[i-1]!='\n')); // \n not \0
int j;
for(j=0; j<i; j++) // stop at i
printf("%c", a[j]); // output is flushed when \n is printed
}
Also test with i<50 not i<=50 because a[50] is outside the array bounds (I've generalized to sizeof(a))
Here is another way you can do this.
#include <stdio.h>
// define Start
#define ARRAY_SIZE 50
// define End
// Function Prototypes Start
void array_reader(char array[]);
void array_printer(char array[]);
// Function Prototypes End
int main(void) {
char user_input[ARRAY_SIZE];
printf("Please enter some characters (50 max)!\n");
array_reader(user_input);
printf("Here is what you said:\n");
array_printer(user_input);
return 0;
}
// Scans in characters into an array. Stops scanning if
// 50 characters have been scanned in or if it reads a
// new line.
void array_reader(char array[]) {
scanf("%c", &array[0]);
int i = 0;
while (
(array[i] != '\n') &&
(i < ARRAY_SIZE)
) {
i++;
scanf("%c", &array[i]);
}
array[i + 1] = '\0';
}
// Prints out an array of characters until it reaches
// the null terminator
void array_printer(char array[]) {
int i = 0;
while (array[i] != '\0') {
printf("%c", array[i]);
i++;
}
}
You may try with this code:
#include <stdio.h>
main()
{
char a[50];
int i;
printf("Give max 50 characters\n");
i=0;
do {
scanf("%c", &a[i]);
i=i+1;
} while(i<50 && a[i-1] != '\n');
a[i] = 0;
for(i=0; a[i] != 0; i++)
printf("%c", a[i]);
}
The function scanf("%c", pointer) will read one character at a time and place it at the pointer location. You are looking for '\0', which is a valid string terminator, but the newline character you get when you press ENTER and that you should be looking for is '\n'.
Also, it is a good idea to terminate the string you have read by adding a '\0' at the end (really a zero). Then use it to stop printing or you may print the "rest" of the contents of an uninitialized char array.

C Primer Plus chapter 6 programming exercise 1

I worked out this problem using what I learned from chapter 6 (current program). My original idea was to print and scan the values into the array with a loop and them print the values of the array, but I have not been able to make it work (commented section under main function). The program just prints newlines (the program prints the letter but I have to press enter to get the next letter). The commented section in the program within the main function is the idea of what I want to do. I included the program below and I thank you in advance for your help.
//This is a program to create an array of 26 elements, store
//26 lowercase letters starting with a, and to print them.
//C Primer Plus Chapter 6 programming exercise 1
#include <stdio.h>
#define SIZE 26
int main(void)
{
char array[SIZE];
char ch;
int index;
printf("Please enter letters a to z.\n");
for(index = 0; index < SIZE; index++)
scanf("%c", &array[index]);
for(index = 0; index < SIZE; index++)
printf("%c", array[index]);
//for(ch = 'a', index = 0; ch < ('a' + SIZE); ch++, index++)
//{ printf("%c", ch);
// scanf("%c", &array[index]);
//}
//for(index = 0; index < SIZE; index++)
// printf("%c", array[index]);
return 0;
}
The problem here is that
When you enter the character and then you press enter, you input two characters. One is the alphabetic character you enter and the other is the \n. That's why you get what you see. Solution is to consume the white space charcaters ..which is done by putting the ' ' in the scanf.
scanf(" %c", &array[index]);
^
Why it works?
Quoting the standard- 7.21.6.2
A directive composed of white-space character(s) is executed by
reading input up to the first non-white-space character (which remains
unread), or until no more characters can be read. The directive never
fails.
Example code:
#include <stdio.h>
#include <stdlib.h>
#define SIZE 6
int main(void)
{
char array[SIZE];
int index;
printf("Please enter letters a to z.\n");
for(index = 0; index < SIZE; index++)
if( scanf(" %c", &array[index]) != 1){
fprintf(stderr,"%s\n","Error in input");
exit(1);
}
else {
printf("read: %c\n",array[index]);
}
for(index = 0; index < SIZE; index++)
printf("%c", array[index]);
putchar('\n');
return 0;
}

How do you count the number of occurences of a letter in a given word?

Hi how would you count the number of occurences in the given word like shown below because with the program I have right now it doesn't seem to room correctly.
#include <stdio.h>
int main(void)
{
char a;
char lang[] = "pneumonoultramicroscopicsilicovolcanoconiosis";
char i = 0;
char count = 0;
printf("pneumonoultramicroscopicsilicovolcanoconiosis\n");
printf("\nEnter the letter you want to find the number of\n");
scanf("%c", &lang);
for (i = 0; i <= 46; i++)
if (a == lang[i]) {
count++;
}
printf("Number of %c is %d..\n", a, count);
return 0;
Your scanf is the problem.
Try:
scanf("%c",&a);
declare count as int instead of char
also change scanf to take input a
#include <stdio.h>
int main(void)
{
char a;
char lang[] = "pneumonoultramicroscopicsilicovolcanoconiosis";
char i = 0;
int count = 0;
printf("pneumonoultramicroscopicsilicovolcanoconiosis\n");
printf("\nEnter the letter you want to find the number of\n");
scanf("%c", &a);
for (i = 0; i <= 46; i++)
if (a == lang[i]) {
count++;
}
printf("Number of %c is %d..\n", a, count);
return 0;
}
You probably shouldn't hard code the max length of the string (46) if at all possible in case you are given a longer string, but assuming it's an assigned assignment that is set it shouldn't be a problem.
i and count should also be ints if possible for a bigger size count. And &lang should be &a since lang is already assigned while a is your checker.

Resources