So I made a program where I have to input a word and it displays if it is a palindrome (a word that is the same both ways) or not.
#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[]){
char word;
int length, counter;
printf("Please enter a word: ");
scanf("%c", &word);
int flag = 1;
for (counter = 0; counter < length && flag; counter++) {
printf("%c\t %c", word[counter], word[length - counter])
if (word[counter] == word[length - counter - 1]){
flag = 0;
}
}
if (flag) {
printf("%c is a palindrome!", word);
}
else {
printf("%c is NOT a palindrome!", word);
}
}
I set it up so that it displays each letter side by side. If a letter isn't the same then the flag is "thrown"(set to 0) and this will end the program saying: "word is NOT a palindrome!"
I get an error at the part where it says word[counter] saying it isn't a subscripted value. What can I do to make this work? Is there anything else I am doing wrong?
This char word; is not an array. This char word[100]; is an Array. Also you read a single character using scanf("%c", &word); not a word (as in a string or series of characters). Use:
fgets (word , 100 , stdin)
Also length is not initialized, so it will lead to UB.
Make this modifications in your program.It will run fine.
#include <stdio.h>
#include <string.h>
int main()
{
char word[100];
int length, counter;
printf("Please enter a word: ");
scanf("%s",word);
length=strlen(word);
int flag = 1;
for(counter = 0; counter < length/2 && flag; counter++)
{
if (word[counter] != word[length-counter-1])
{
flag = 0;
break;
}
}
if (flag)
{
printf("%s is a palindrome!\n", word);
}
else {
printf("%s is NOT a palindrome\n!", word);
}
}
****************************************************************
* Simple Array Palindrome Program *
****************************************************************/
#include <iostream>
using namespace std;
int main (){
int arr_size;
int flag=0;
/*****************************************
* Array Size *
*****************************************/
cout<<"Enter The Array Size: \n->arr[";
cin>>arr_size;cout<<" ]";
int arr[arr_size];
/*****************************************
* User_Input *
*****************************************/
for(int i=0;i<arr_size;i++){
cout<<"Enter Value For Arr[ "<<i<<" ] -> ";
cin>>arr[i];
}
/*****************************************
* Palindrome_Check *
*****************************************/
for(int k=0,j=arr_size-1;k<arr_size && j>-1;k++)
{
if(arr[i]==arr[j];
{
flag++;
}
}
/*****************************************
* Flag Check *
*****************************************/
if(flag==arr_size) {
cout<<"Array Is Palindrome: ";
}
else
{
cout<<"Array Is Not Palindrome: ";
}
}
Related
I'm in the middle of homework and I need some help here.
So this is the code
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
int upper=0,lower=0,number = 0;
char ch[500];
printf("Enter the String:\n");
gets(ch);
i=0;
while(ch[i]!=0)
{
if(ch[i]>='A' && ch[i]<='Z')
{
upper++;
}
else if(ch[i]>='a' && ch[i]<='z')
{
lower++;
}
else if(ch[i]>='0' && ch[i]<='9')
{
number++;
}
i++;
}
printf("lowercase letters: %d",lower);
printf("\nuppercase letters: %d",upper);
printf("\nnumber letters: %d",number);
getch();
return 0;
}
As you can see here. When you give a string input. The code will give a total number of uppercase,lowercase and number
for example: If I'm giving "Hello World 123" To the code. The result will be 2 Uppercases 8 Lowercases and 3 Numbers
The problem is the task want me to print all 3 types of letter seperately
for example: from "Hello World 123" Should print "HW" , "elloorld" and "123"
I know that I have to create another 3 arrays for seperate the letter. I tried to create like upperc[i],lowerc[i] and num[i] to input the letter in each of if command but It doesn't work.
So how can I do that?
Here's one way of going about it. It doesn't require 3 separate arrays like you thought because it prints the characters directly:
#include <stdio.h>
#include <ctype.h>
int main(void)
{
printf("Enter a string: ");
char str[1024] = {0};
fgets(str, sizeof str, stdin);
// Use different functions in each iteration
int (*ctype_fns[])(int) = {isupper, islower, isdigit};
for (unsigned i = 0; i < sizeof ctype_fns / sizeof *ctype_fns; ++i)
{
for (const char *it = str; *it; ++it)
{
// If char matches requirements, print it
if (ctype_fns[i]((unsigned char)*it))
putchar(*it);
}
putchar('\n');
}
}
Example of running:
Enter a string: Hello World 123
HW
elloorld
123
For your simple homework project you must assume some decent values. We assume the input is no longer than 128 characters and each of the three types is no more than 64. In real life projects we must check on these values.
Adapting your main, the following would work:
#include <stdio.h>
#include <stdlib.h>
#define MAX_IN 128
#define MAX_X 64
int main()
{
int i;
int upper=0,lower=0,number = 0;
char ch[MAX_IN], chUpper[MAX_X], chLower[MAX_X], chNumber[MAX_X];
printf("Enter the String:\n");
gets(ch);
i=0;
while(ch[i]!=0)
{
if(ch[i]>='A' && ch[i]<='Z')
{
chUpper[upper++]= ch[i];
}
else if(ch[i]>='a' && ch[i]<='z')
{
chLower[lower++]= ch[i];
}
else if(ch[i]>='0' && ch[i]<='9')
{
chNumber[number++]= i;
}
i++;
}
chLower[lower]= '\0';
chUpper[upper]= '\0';
chNumer[number]= '\0';
printf("lowercase letters: %d: %s\n",lower, chLower);
printf("uppercase letters: %d: %s\n",upper, chUpper);
printf("number letters: %d: %s\n",number, chNumber);
getch();
return 0;
}
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define MAX_IN 128
#define MAX_X 64
int main()
{
int i;
int upper=0,lower=0,number = 0;
char ch[MAX_IN], chUpper[MAX_X], chLower[MAX_X], chNumber[MAX_X];
printf("Enter the String:\n");
gets(ch);
printf("input given is : %s\n",ch);
for (i=0;ch[i]!='\0';i++)
{
if(ch[i]>='A' && ch[i]<='Z')
{
chUpper[upper++]= ch[i];
}
else if(ch[i]>='a' && ch[i]<='z')
{
chLower[lower++]= ch[i];
}
else if(ch[i]>='0' && ch[i]<='9')
{
chNumber[number++]= ch[i];
}
if ((ch[i+1]) == ' '){
i += 1;
}
}
printf("lowercase letters: %d: %s\n",lower, chLower);
printf("uppercase letters: %d: %s\n",upper, chUpper);
printf("number letters: %d: %s\n",number, chNumber);
return 0;
}
As stated in the title I am trying to find all lower-case letters that are not in a series of words. There are no upper-case letters, digits, punctuation, or special symbols.
I need help fixing my code. I am stuck and do not know where to go from here.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void){
int letters[26];
char words[50];
int i = 0, b = 0;
printf("Enter your input : ");
scanf("%s", words);
for(i = 0; i < 26; i++){
letters[i] = 0;
}
while(!feof(stdin)){
for(b = 0; b < strlen(words) - 1; b++){
letters[ words[b] - 'a']++;
scanf("%s", words);
}
}
printf("\nMissing letters : %c ", b + 97);
return 0;
}
My output is giving me some random letter that I do not know where it is coming from.
Here is a working first implementation.
As well as the comments that have already been made, you should use functions wherever possible to separate out the functionality of the program into logical steps. Your main function should then just call the appropriate functions in order to solve the problem. Each function should be something that is self contained and testable.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_INPUT 20 /* Max input to read from user. */
char *readinput(void);
void find_missing_lower_case(char *, int);
int main()
{
char *user_input = readinput();
int len_input = strlen(user_input);
printf("user input: %s\n", user_input);
printf("len input: %d\n", len_input);
find_missing_lower_case(user_input, len_input);
/* Free the memory allocated for 'user_input'. */
free(user_input);
return 0;
}
char *readinput()
{
char a;
char *result = (char *) malloc(MAX_INPUT);
int i;
for(i = 0; i < MAX_INPUT; ++i)
{
scanf("%c", &a);
if( a == '\n')
{
break;
}
*(result + i) = a;
}
*(result + i) = '\0';
return result;
}
void find_missing_lower_case(char *input, int len_input)
{
int a = 97; /* ASCII value of 'a' */
int z = 122; /* ASCII value of 'z' */
int lower_case_chars[26] = {0}; /* Initialise all to value of 0 */
/* Scan through input and if a lower case char is found, set the
* corresponding index of lower_case_chars to 1
*/
for(int i = 0; i < len_input; i++)
{
char c = *(input + i);
if(c >= a && c <= z)
{
lower_case_chars[c - a] = 1;
}
}
/* Iterate through lower_case_chars and print any values that were not set
* to 1 in the above for loop.
*/
printf("Missing lower case characters:\n");
for(int i = 0; i < 26; i++)
{
if(!lower_case_chars[i])
{
printf("%c ", i + a);
}
}
printf("\n");
}
I figured it out and this is the code I used.
int main(void)
{
int array[26];
char w;
int i=0;
for(i=0; i<26; i++) {
array[i]=0; }
printf("Enter your input: ");
scanf("%c", &w);
while(!feof(stdin)) {
array[w-97] = 1;
scanf("%c", &w); }
printf("Missing letters: ");
for(i=0; i<26; i++) {
if(array[i] == 0) {
printf("%c ", i+97); }
}
printf("\n");
return 0;
}
I am programming a palindrome code to check whether a given string is a palindrome or not. Eg: mom, 1001 ...
MY_CODE:
#include <stdio.h>
#include <stdlib.h>
#include <stdio_ext.h>
int main()
{
int i,n;
char p[999];
char flag;
printf("number of characters in the strings");
scanf("%d",&n);
printf("Enter string: ");
for (i=0;i<n;i++)
{
printf("\n");
__fpurge(stdin);
scanf("%c",&p[i]);
}
for (i=0;i<n;i++)
{
if (p[i]==p[n-1-i])
{
flag=0;
break;
}
else flag=1;
}
if (flag==1)
printf("It's not a palindrome");
if (flag==0)
printf("It's a palindrome.");
return 0;
}
I am trying to do that with the idea that if the last and first characters are matched and so on for the next characters. If they are all matched the string is a palindrome otherwise it is not,as simple as that but my output
shows 123;mom; and every nonsense, a palindrome ("even the word 'nonsense' :D).
Can someone guide me?
P.S.: I am a newbie and learning C. My OS: Ubuntu 15.10.
You are checking if characters are the same and is so, setting flag=0, to say it is a palindrome, but that will happen for the 1st match - if other matches do not occur, the flag is never set to not be a palindrome.
The better way is assume it is a palindrome and then if anything provides otherwise, set it as false.
#include <stdio.h>
#include <string.h>
int main()
{
char p[999];
printf("Enter string: ");
if(fgets(p, sizeof(p), stdin))
{
int palindrome = 1;
int i;
int n;
n = strlen(p);
/* handle new line at end of fgets input */
if(p[n-1] == '\n')
p[n-1] = '\0';
n = strlen(p);
/* 0 length string (after newline removed) - not a palindrome */
if(n == 0) palindrome = 0;
for(i=0;i<n/2;i++)
{
/* look for a chatacter pair that doesn't match - if find, then we don't have a palindrome */
if(p[i] != p[n-1-i])
palindrome = 0;
}
if(palindrome)
printf("is a palindrome\n");
else
printf("is not a palindrome\n");
}
return 0;
}
From your code, I have a couple of things to say as follows.
#include <string.h>
#include <stdio.h>
// #include <stdlib.h> // this is not necessary.
int main()
{
// int i,n;
// char p[999];
// char flag;
// ######################################################
// You literally don't need to input the number of characters since you can get the string's length from `strlen`.
// In addition, different inputs yield different lengths,
// therefore, it is not applicable if the input becomes extremely long, for example.
//
// printf("number of characters in the strings");
// scanf("%d",&n);
// printf("Enter string: ");
// for (i=0;i<n;i++)
// {
// printf("\n");
// __fpurge(stdin);
// scanf("%c",&p[i]);
// }
// ######################################################
char str[100];
printf( "Enter a value :");
gets( str );
int i=0;
int n;
n = strlen(str)-1;
while (i<n)
{
if (str[i++] != str[n--])
{
printf("%s is Not palidrome\n", str);
return 0;
}
}
printf("%s is palidrome\n", str);
// for (i=0;i<n;i++)
// {
// if (p[i]==p[n-1-i])
// {
// flag=0;
// break;
// }
// else flag=1;
// }
// if (flag==1)
// printf("It's not a palindrome");
// if (flag==0)
// printf("It's a palindrome.");
return 0;
}
With a slightly modification as above, that code works well.
Note: The palindrome problem is a classical problem, and you literally can find many solutions from the internet. You can refer the solution code in C at here.
Update: Here is my update with fgets and while-loop.
#include <string.h>
#include <stdio.h>
int main()
{
char str[100];
printf( "Enter a string (char/value) :");
fgets (str, 100, stdin);
int i=0;
int n;
n = strlen(str)-1;
while (i<n)
{
if (str[i++] != str[n--])
{
printf("%s is Not palidrome\n", str);
return 0;
}
}
printf("%s is palidrome\n", str);
return 0;
}
My program in C which is Palindrome has an error in its function. My function is not comparing the 2 characters in my string. When I type a single character it answers palindrome but if it is two or more always not palindrome.
Code:
int IntStrlength=strlen(StrWord);
int IntCtr2=0;
int IntCtr=1, IntAnswer;
while(IntCtr<=(IntStrlength/2)){
printf(" %d %d\n", IntCtr2,IntStrlength);
if(StrWord[IntStrlength] != StrWord[IntCtr2]){
IntAnswer=0;
printf(" %d=Not Palindrome", IntAnswer);
exit (0);
}//if(StrWord[IntCtr2]!=StrWord[IntStrlength]) <---------
else{
IntCtr2++;
IntStrlength--;
}// else <--------
IntCtr++;
}//while(IntCtr<IntStrlength/2) <-----------
IntAnswer=1;
printf(" %d=Palindrome", IntAnswer);
return ;
}
Single character:
Two or more characters:
Why not write it like this
int wordLength = strlen(StrWord);
for (int i=0;i<(wordLength/2);i++) {
if (StrWord[i] != StrWord[wordLength-i-1]) {
return 0;
}
}
return 1;
For words with an even length (say 8) the counter will go from 0 to 3, accessing all letters. For uneven words (say 7) the c ounter will go from 0 to 2, leaving the middle element unchecked. This is not necessary since its a palindrome and it always matches itself
#include<stdio.h>
int check_palindrom(char *);
int main()
{
char s1[20];
printf("Enter the string...\n");
gets(s1);
int x;
x=check_palindrom(s1);
x?printf("Palindrom\n"):printf("Not Palindrom\n");
}
int check_palindrom(char *s)
{
int i,j;
for(i=0;s[i];i++);
for(i=i-1,j=0;i>j;i--,j++)
if(s[i]!=s[j])
return 0;
if(s[i]==s[j])
return 1;
}
Enter the string...
radar
Palindrom
I've seen this algorithm before in a interview book called "Cracking the Coding Interview".
In it the author shows a very simple and easy implementation of the code. The code is below: Also here is a video explaining the code.
#include<stdio.h>
#include<string.h> // strlen()
void isPalindrome(char str[]);
int main(){
isPalindrome("MOM");
isPalindrome("M");
return 0;
}
void isPalindrome(char str[]){
int lm = 0;//left most index
int rm = strlen(str) - 1;//right most index
while(rm > lm){
if(str[lm++] != str[rm--]){
printf("No, %s is NOT a palindrome \n", str);
return;
}
}
printf("Yes, %s is a palindrome because the word reversed is the same \n", str);
}
You can do this like this:
#include <stdio.h>
#include <string.h>
int check_palindrome(char string []);
int main()
{
char string[20];
printf("Enter the string...\n");
scanf ("%s", &string);
int check;
check = check_palindrome (string);
if (check == 0)
printf ("Not Palindrome\n");
else
printf ("Palindrome\n");
return 0;
}
int check_palindrome (char string [])
{
char duplicate [];
strcpy (string, duplicate);
strrev (string);
if (strcmp (string, duplicate) == 0)
return 1;
else
return 0;
}
This uses the strcmp and strrev function.
Take a look at this code, that's how I have implemented it (remember to #include <stdbool.h> or it will not work):
for(i = 0; i < string_length; i++)
{
if(sentence[i] == sentence[string_lenght-1-i])
palindrome = true;
else
{
palindrome = false;
break;
}
}
Doing that it will check if your sentence is palindrome and, at the first occurence this is not true it will break the for loop. You can use something like
if(palindrome)
printf(..);
else
printf(..);
for a simple prompt for the user.
Example :
radar is palindrome
abba is palindrome
abcabc is not palindrome
Please , pay attention to the fact that
Abba
is not recognized as a palindrome due to the fact that ' A ' and 'a' have different ASCII codes :
'A' has the value of 65
'a' has the value of 97
according to the ASCII table. You can find out more here.
You can avoid this issue trasforming all the characters of the string to lower case characters.
You can do this including the <ctype.h> library and calling the function int tolower(int c); like that :
for ( ; *p; ++p) *p = tolower(*p);
or
for(int i = 0; str[i]; i++){
str[i] = tolower(str[i]);
}
Code by Earlz, take a look at this Q&A to look deeper into that.
EDIT : I made a simple program to do this, see if it can help you
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>
#include <ctype.h>
void LowerCharacters(char *word, int word_lenth);
int main(void){
char *word = (char *) malloc(10);
bool palindrome = false;
if(word == 0)
{
printf("\nERROR : Out of memory.\n\n");
return 1;
}
printf("\nEnter a word to check if it is palindrome or not : ");
scanf("%s", word);
int word_length = strlen(word);
LowerCharacters(word,word_length);
for(int i = 0; i < word_length; i++)
{
if(word[i] == word[word_length-1-i])
palindrome = true;
else
{
palindrome = false;
break;
}
}
palindrome ? printf("\nThe word %s is palindrome.\n\n", word) : printf("\nThe word %s is not palindrome.\n\n", word);
free(word);
return 0;
}
void LowerCharacters(char *word, int word_length){
for(int i = 0; i < word_length; i++)
word[i] = tolower(word[i]);
}
Input :
Enter a word to check if it is palindrome or not : RadaR
Output :
The word radar is palindrome.
This code may help you to understand the concept:
#include<stdio.h>
int main()
{
char str[50];
int i,j,flag=1;
printf("Enter the string");
gets(str);
for(i=0;str[i]!='\0';i++);
for(i=i-1,j=0;j<i;j++,i--)
{
str[i]=str[i]+str[j];
str[j]=str[i]-str[j];
str[i]=str[i]-str[j];
}
for(i=0;str[i]!='\0';i++);
for(i=i-1,j=0;j<i;j++,i--)
{
if(str[i]==str[j]){
flag=0;
break;
}
}if(flag==0)
{
printf("Palindrome");
}else
{
printf("Not Palindrome");
}
}
I have solution for this
char a[]="abbba";
int i,j,b=strlen(a),flag=0;
for(i=0,j=0; i<b; i++,j++)
{
if(a[i]!=a[b-j-1])
{
flag=1;
break;
}
}
if(flag)
{
printf("the string is not palindrum");
}
else
{
printf("the string is palindrum");
}
This may works for you
#include <stdio.h>
#include <stdlib.h>
int main(void) {
setbuf(stdout,NULL);
int i,limit;
char string1[10];
int flag=0;
printf("enter a string");
scanf("%s",string1);
limit=strlen(string1);
for(i=0;i<limit;i++){
if(string1[i]!=string1[limit-i-1]){
flag=1;
break;
}
} if(flag==1){
printf("entered string is not palindrome");
}else{
printf("entered string is palindrome");
}
return EXIT_SUCCESS;
}
I am trying to create a program that can modify a text according to the user key. It seems to work well, until I input something and it adds extra things.
For example, if I add the word hello and a key of 3, it says khoor plus some extra weird characters. Can you tell me please what is the problem? Thank you very much.
#include <stdio.h>
#include <ctype.h>
#define MAXSIZE 100
void encrypt(senTence[], int key);
int main(void)
{
int userKey;
char sentence[MAXSIZE];
printf("Input the text that you want to encrypt:\n> ");
fgets(sentence, 99, stdin);
// printf("\nThe string that you wrote is:\n%s\n\n", sentence);
printf("Input the key:\n");
scanf("%d", &userKey);
//printf("\nThe key that you selected is: %d\n\n", userKey);
encrypt(sentence, userKey);
return 0;
}
void encrypt(const char senTence[], int key)
{
int i = 0;
char q[MAXSIZE];
for(i = 0; senTence[i] != '\0'; ++i)
{
if( ( isupper(senTence[i]) ) || ( islower(senTence[i]) ) )
{
q[i] = senTence[i] + (char)key;
}
else
{
q[i] = (senTence[i]);
}
}
printf("%s", q);
}
You didn't terminate the result string q in encrypt().
Add the following line before printf().
q[i] = '\0';
Another way is initialize q to all-zero:
char q[MAXSIZE] = {0};
You forgot to null terminate your array q, so using as a string will not be possible.
After you have performed the required operation on all the elements of the senTence and stored it to q, you need to null terminate q.
Use
q[i] = '\0';
printf("%s\n", q);
I ran the code, was giving a few warnings and an error, related to the function prototype. I fixed that and it is working fine now!
#include <stdio.h>
#include <ctype.h>
#define MAXSIZE 100
void encrypt(const char senTence[], int key);
int main(void)
{
int userKey;
char sentence[MAXSIZE];
printf("Input the text that you want to encrypt:\n> ");
fgets(sentence, 99, stdin);
// printf("\nThe string that you wrote is:\n%s\n\n", sentence);
printf("Input the key:\n");
scanf("%d", &userKey);
//printf("\nThe key that you selected is: %d\n\n", userKey);
encrypt(sentence, userKey);
return 0;
}
void encrypt(const char senTence[], int key)
{
int i = 0;
char q[MAXSIZE];
for(i = 0; senTence[i] != '\0'; ++i)
{
if( ( isupper(senTence[i]) ) || ( islower(senTence[i]) ) )
{
q[i] = senTence[i] + (char)key;
}
else
{
q[i] = (senTence[i]);
}
}
printf("%s", q);
}