I'm trying to write a recursive program that makes/prints a string with each of all the possible combinations of vowels(A, E, I, O, U), that includes at least once every vowel. The number of elements is taken as input from the user (so to include each vowel at least once >=5). I really can't figure out the right way to do this.
Here's my take on it (not working though):
#include <stdio.h>
#include <stdlib.h>
int voc_gen(int n, char *array);
char rand_voc();
int main()
{
char *array, voc[] = "AEIOU";
int i, N;
printf("Insert number of elements for vocals string:\n");
scanf("%d", &N);
array = malloc(N * sizeof(char));
for(i=0; i<5; i++)
array[i] = voc[i];
voc_gen(N-5, array);
return 0;
}
int voc_gen(int n, char *array){
if(n==0)
return 0;
else{
array[voc_gen(n, array)] = rand_voc();
printf("%s\n", array);
return voc_gen(n-1, array);
}
}
char rand_voc(){
char array[] = "AEIOU";
int i;
return array[rand()%5];
}
Related
I want to convert Name and Surname(e.g., Nova Stark) into a large integer by juxtaposing integer ASCII codes for alphabet, print the corresponding converted integer then cut the large integer into two halves and add the two halves.Following is my approach:-
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char* arr2str(int arr[], int size) {
static char buffer[256];
memset(&buffer[0], 0, sizeof(buffer)/sizeof(char));
char *ptr = &buffer[0];
for(int i=0; i<size; ++i) {
sprintf(ptr += strlen(ptr), "%d", arr[i]);
}
return buffer;
}
int arr2int(int arr[], int size)
{
char buffer[256] = {0,};
char *ptr = &buffer[0];
for(int i = 0; i < size; ++i) {
sprintf(ptr += strlen(ptr), "%d", arr[i]);
}
return atoi(&buffer[0]);
}
int main()
{
int *A;
long long int num;
int div,base=10;
char name[50],asc[200];
printf("Enter your name : ");
scanf(" %[^\n]",name);
int len=strlen(name);
A=(int*)malloc(len*sizeof(int));
for(int i=0;i<len;i++)
{
A[i]=name[i];
}
char *str = arr2str(A, len); //for converting array to string
num = arr2int(A, len); //again for converting the character array to integer.
//num=array_to_num(A,len);
div=base;
while(num/div>div)
{
div=div*base;
}
long long int a=num/div;
long long int b=num%div;
long long int c=a+b;
printf("The required integer is %lld and the sum is %lld ",num,c);
return 0;
}
But I am not getting the desired output. Please help!
Also, if there exists a simpler approach to the problem please specify that too.
Following is running, for explanations see comments in the code. Maybe you have to handle the whitespaces in the name:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int *A;
long long int num;
int div,base=10;
char name[50];
printf("Enter your name : ");
scanf(" %[^\n]",name);
int len=strlen(name);
A=(int*)malloc(len*sizeof(int));
for(int i=0;i<len;i++)
{
*(A+i)=(int)name[i]; // *(A+i) is accessing array as pointer+index : https://www.programiz.com/c-programming/c-dynamic-memory-allocation
// letters to ascii is done by simply typecasting to (int)
}
// string to int array
for(int i=0;i<len;i++)
{
printf("%i -> %c \n", *(A+i), (char)(*(A+i)));
}
// long long int from concatenating the elements of the int array
int s_idx=0; // index for string
char str[512]; //string of fixed size, possibly malloc this
for (int i=0; i<len; i++)
s_idx += snprintf(&str[s_idx], 512-s_idx, "%d", *(A+i));
printf("%s \n", str);
num = strtoll(str, NULL, 10); // https://en.cppreference.com/w/c/string/byte/strtol
// from here your code is unchanged
div=base;
while(num/div>div)
{
div=div*base;
}
long long int a=num/div;
long long int b=num%div;
long long int c=a+b;
printf("The required integer is %lld and the sum is %lld \n ",num,c);
free(A);
return 0;
}
I need to find all suffix starting with a character X. For example, for int suffix (char str [], char c) when the word is ababcd and the letter b it should return:
babcd
bcd
and the number 2.
This is my code:
#include <stdio.h>
#include <string.h>
int main()
{
char c;
char str[128];
int counter=0;
printf ("Please enter charachter and a string \n");
scanf("%c %s",&c,str);
counter = my_suffix(str,c);
printf("The string has %d suffix \n",counter);
return 0;
}
int my_suffix(char str[],char c) {
int counter = 0;
for (int i=0; i < strlen(str); i++)
{
if (str[i] == c)
{ puts(str+i);
counter++;
}
}
return counter;
}
I couldn't find why it's not running,
Thanks!
Your code is fine you should just written following method above int main()
int my_suffix(char str[],char c){...}
I need to convert an ascii input to hex input. I am very bad with C so if you could include some explanation that would be very helpful. This code is just a bunch of bits and pieces but most is probably wrong or useless. Afterwards i need to use user input to select the string but the hard part is getting it to convert at all.
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
void crypt(char *buf, char *keybuf, int keylen) {
//This is meant to encrypt by xor-ing with the sentence and key entered//
//It is also supposed to replace the original buf with the new version post-xor//
int i;
int *xp;
xp=&i;
for(i=0; i<keylen; i++) {
buf[i]=buf[i]^keybuf[i];
xp++;
}
}
int convertkey(char *keybuf) {
int keylen=0;
//I need to add something that will return the length of the key by incrementing keylen according to *keybuf//
return keylen;
}
int main(int argc, char * argv[]){
char x;
char *xp;
xp = &x;
char a[47];
char *ap;
ap=a;
printf("Enter Sentence: ");
scanf("%[^\n]",a);
printf("Enter key: ");
scanf("%d",xp);
printf("You entered the sentence: %s\n",a);
printf("You entered the key: %d\n",x);
convertkey(xp);
crypt(ap,xp,x);
printf("New Sentence: %s\n",a);
return 0;
}
Such as it is, I have reorganised your posted code so at least it compiles, even if the intent is unclear. Perhaps you can take it on from here.
#include <stdio.h>
#include <stdlib.h>
// moved out of main()
void crypt(char *buf, char *keybuf, int keylen) {
int i; // added declaration
for(i=0; i<keylen; i++) { // corrected syntax and end condition
buf[i]=buf[i]^keybuf[i];
//xp++; // out of scope
}
}
// moved out of main()
int convertkey(char *keybuf) {
int keylen=0;
return keylen;
}
int main(int argc, char * argv[]){
int x=0;
int *xp;
xp = &x; // xp=&x{0};
return 0; // exit(0);
}
This is the final product I was looking for but was very poor at explaining/coding.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void crypt(char *buf, char *keybuf, int keylen) {
int i;
int length= strlen(buf)-1;
for(i=0; i<length; i++) {
buf[i]=buf[i]^keybuf[i%keylen];
printf("%c",buf[i]);
}
printf("\n");
}
int convertkey(char *keybuf) {
int i=0;
for(i=0;keybuf[i]!='\n';i++){
if(keybuf[i]>='0' & keybuf[i]<='9'){
keybuf[i]=keybuf[i]-'0';
}
else if(keybuf[i]>='a' & keybuf[i]<='f'){
keybuf[i]=(keybuf[i]-'a')+10;
}
}
return i;
}
int main(int argc, char * argv[]){
char keychars[12];
char a[48];
char *ap;
int i;
ap=a;
printf("Enter Sentence: ");
fgets(a, 48, stdin);
printf("Enter Key: ");
fgets(keychars, 12, stdin);
for (i=0; i<strlen(keychars); i++) {
char c = keychars[i];
printf("keychars[%d]=%c (character), %d (decimal), %x (hex)\n", i, c, c, c);
}
crypt(ap,keychars,convertkey(keychars));
return 0;
}
I am having a few issues with my code. First: when I try to compile, I get error: too few arguments to function 'strcmp'. I have looked all over and made multiple changes and am still unable to get it to work. Second: when my code does compile (if I remove the strcmp part), it will not complete the count functions correctly. Can anyone please assist? Thank you!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int count(char array[], int size);
int stringLen(char array[]);
int convert(char ch);
int value, n;
int main()
{
//char * str;
//char s;
char a[100];
char b[100];
char c[100];
int charCount = stringLen(a);
int lCount = count(a, charCount);
printf("Enter your string: \n");
scanf("%s \n", a);
printf("Enter your string: \n");
scanf("%s \n", b);
printf("Enter your string: \n");
scanf("%s \n", c);
printf("The count is %d, length is %d\n", lCount, charCount);
int i;
for(i = 0; i < charCount; i++)
{
char c = a[i];
printf("Char %s = %d \n", &c, value);
}
n = strcmp(char string1[], char string2[], char string3[]);
printf("The first string in the alphabet is: %d \n", n);
return 0;
}
int stringLen(char array[])
{
char count;
int index;
while(array[index] !=0)
{
count++;
index++;
}
return count;
}
int count(char array[], int size)
{
int count;
int i;
for(i = 0; i < size; i++)
{
if(array[i] == 'a')
{
count ++;
}
else if(array[i] == 'A')
{
count ++;
}
}
return count;
}
This is not right way to use strcmp.
n = strcmp(char string1[], char string2[], char string3[]);
strcmp is used for compararison of string. See doc
int result = strcmp (string1,string2)
If strings are same, function will return 0.
This code cannot convert char* to char**. I don't know what it means.
Here is my code:
#include <stdio.h>
#include <conio.h>
#include <string.h>
shift( char *s[] , int k )
{
int i,j;
char temp[50];
for( i = 0 ; i < k ; i++ )
temp[i]=*s[i] ;
for( j = 0 ; j < strlen(*s) ; j++ )
{
*s[j] = *s[k] ;
k++ ;
}
strcpy(*s,temp);
}
main()
{
int i,j=0,k;
char s[30];
printf("please enter first name ");
gets(s);
scanf("%d",&k);
shift( &s , k);
puts(s);
getch();
}
The program is supposed to:
read string S1 and index âKâ, then call your own function that rotates the string around
the entered index. The output of your program should be as follows:
Enter your string: AB3CD55RTYU
Enter the index of the element that rotates the string around: 4
The entered string: AB3CD55RTYU
Enter the element that rotates the string around: D
The rotated string is : D55RTYUAB3C
&s means char (*)[30](pointer to array of char[30]) not char *[] (array of pointer to char)
For example, It modified as follows.
#include <stdio.h>
#include <conio.h>
#include <string.h>
void shift(char s[],int k){
int i, len;
char temp[50];
for(i=0;i<k;i++)
temp[i]=s[i];
temp[i] = '\0';
len = strlen(s);
for(i=0;k<len;i++)
s[i]=s[k++];
strcpy(&s[i],temp);
}
int main(){
int k;
char s[30];
printf("please enter first name ");
gets(s);
scanf("%d", &k);
shift(s , k);
puts(s);
getch();
return 0;
}
example using a structure(Copy is performed). However, this is waste of resources.
#include <stdio.h>
#include <conio.h>
typedef struct word {
char str[30];
} Word;
Word shift(Word word, int k){
Word temp;
int i = 0, j;
for(j=k;word.str[j]!='\0';++j)
temp.str[i++]=word.str[j];
for(j=0;j<k;++j)
temp.str[i++]=word.str[j];
temp.str[i] = '\0';
return temp;
}
int main(){
int k;
Word w;
printf("please enter first name ");
gets(w.str);
scanf("%d", &k);
w=shift(w , k);
puts(w.str);
getch();
return 0;
}
shift(char* s[],int k); //shift expects char**; remember s[] is actually a pointer
main()
{
char s[30]; // when you declare it like this s is a pointer.
...
shift(s , k);
}
You should change the shift function signature to shift(char* s,int k); since you don't really need pointer to pointer. You just need to pass the beginning of the array.