I wrote a simple program to multiply a string a defined times.
But, it doesn't really work, and don't know why...
It's so simple that I don't know what the problem could be...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *product(char *str, int k);
int main()
{
char strg[1000];
char *prod;
int mult;
scanf("%s", strg);
scanf("%d", mult);
prod = product(strg, mult);
printf("%s\n", prod);
return EXIT_SUCCESS;
}
char *product(char *str, int k)
{
int i, j;
int len = strlen(str);
char *res = (char *) malloc(sizeof(char) * (len * k + 1));
for (i = 0, j = 0; i < (len * k); i++, j++)
{
if (j == len) j = 0;
res[i] = str[j];
}
res[++i] = '\0';
return res;
}
Anyone who can help me to figure out where's the problem? :D
At the end of the loop, i is already the index of the position for the terminator.
Just do
res[i] = 0;
Related
I need to split the string of n size and append in an array.
For example:
input:
abcdefghi
4
output:
[abcd,bcde,cdef,defg,efgh,fghi]
My code giving wrong answer:
#include <stdio.h>
#include <string.h>
int main()
{
char str[] = "abcdefghi";
char result[100];
for(int i=0;i<strlen(str);i++){
strncat(result, str, str[i]+4);
}
printf("result: %s\n ", result);
}
My output:
abcdefgiabcdefgiabcdefgiabcdefgiabcdefgiabcdefgiabcdefgiabcdefgi
What mistake have I made??
Would you please try the following:
#include <stdio.h>
#include <string.h>
int main()
{
char str[] = "abcdefghi";
char result[100];
int n = 4;
int i, j;
char *p = result; // pointer to the string to write the result
*p++ = '['; // left bracket
for (i = 0; i < strlen(str) - n + 1; i++) { // scan over "str"
for (j = i; j < i + n; j++) { // each substrings
*p++ = str[j]; // write the character
}
*p++ = i == strlen(str) - n ? ']' : ','; // write right bracket or a comma
}
*p++ = '\0'; // terminate the string with a null character
printf("result: %s\n", result); // show the result
return 0;
}
Output:
result: [abcd,bcde,cdef,defg,efgh,fghi]
Might this work for you?
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] = "abcdefghijklmno";
char result[100][100];
int nSplit = 4; //Split size
int nLength = strlen (str); //Lenth of the string
int nTotalString = nLength - nSplit; //total possibilities
int nStrCount = 0;
for (int i = 0; i <= nTotalString ; i ++)
{
for (int j = 0; j < nSplit; j++)
result[nStrCount][j] = str[i + j];
nStrCount++;
}
//print array
printf ("result:[");
for (int k = 0; k < nStrCount; k++)
printf ("\"%s\" ", result[k]);
printf ("]");
return 0;
}
Hi I am pretty new to C and was wondering how to return an entire array. For example I have this function here.
char* foo(int x)
{
char *num = (char*)malloc(x*sizeof(int));
num[0] = '1';
num[1] = '2';
num[2] = '3';
num[3] = '4';
return num;
}
I realized that when I return num it only returns the first index of num. But is there any way to return the whole array, 1234? Any help will be greatly appreciated!
Since the foo() function returns a pointer, you can see that all values are printed when you use the %s format specifier. The display() function prints the data in the memory area pointed to by the pointer as characters.
#include <stdio.h>
#include <stdlib.h>
char* foo(int x)
{
char* num = (char*) malloc((x + 1) * sizeof(char));
for(size_t i = 0 ; i < x ; ++i)
num[i] = i + 1 + '0';
num[x] = '\0';
return num;
}
void display(char *array, size_t size)
{
for(size_t i = 0 ; i < size && array[i] != '\0' ; ++i)
printf("array[%ld]: %c\n", i, array[i]);
}
int main()
{
const size_t size = 4;
char *result = foo(size);
printf("%s\n", result);
display(result, size);
return 0;
}
Output:
1234
array[0]: 1
array[1]: 2
array[2]: 3
array[3]: 4
See if you are new to C, then learn it first do some googling and research. If you don't find anything then read some theory of a similar topic for examples (How to return an array in C?). After that some error is happening in your code then you can ask it on stackoverflow.
By the way your should be like:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *foo(int x); // fix prototype errors
char *foo(int x)
{
char *num = (char *)calloc(x + 1, sizeof(char)); // we added +1 to append the null terminating character in `num`
for (size_t i = 0; i < x; i++)
num[i] = (char)(i + 48);
return num;
}
/* #returns no. of character written on stdout */
int print_foo(const char *num); // fix prototype errors
int print_foo(const char *num)
{
if (num)
{
size_t z = 0;
for (size_t i = 0; i < num[i] != '\0'; i++)
z += fprintf(stdout, "num[%lu] = %c\n", i, num[i]);
return z;
}
return -1;
}
int main(void)
{
char *num = foo(10);
print_foo((const char *)num);
free(num); // free any heap allocated resources before exiting the application
return 0;
}
I have the following code:
#include "stdafx.h"
#include "string.h"
#include "ctype.h"
/*selection sort*/
void swap(int A[], int j, int k)
{
int p = A[k];
int i;
for (i = 0; i < (k - j); i++)
{
A[k - i] = A[k - i - 1];
}
A[j] = p;
}
/*greatest number in an array*/
int max(int A[], int N, int k)
{
int max = k, i;
for (i = k; i < N; i++)
{
if (A[max] < A[i])
max = i;
}
return max;
}
int count_nonspace(const char* str)
{
int count = 0;
while(*str)
{
if(!isspace(*str++))
count++;
}
return count;
}
int _tmain(int argc, _TCHAR* argv[])
{
int a[256];
int i = 0, j = 0, count[256] = { 0 };
char string[100] = "Hello world";
for (i = 0; i < 100; i++)
{
for (j = 0; j<256; j++)
{
if (tolower(string[i]) == (j))
{
count[j]++;
}
}
}
for (j = 0; j<256; j++)
{
printf("\n%c -> %d \n", j, count[j]);
}
}
Program is calculating the number of apperances of each character in a string. Now it prints the number of apperances of all 256 characters, whereas i want it to prinf only the character with greatest number of apperances in a string. My idea was to use the selection sort method to the array with the nubmer of apperances, but this is not working, thus my question is how to printf only the character with the greatest number of apperances in the string?
If anybody would have doubts, this is NOT my homework question.
EDIT: I've just noticed that this code printf apperances of characters begining with "j" why is that?
I started typing this before the others showed up, so I'll post it anyway. This is probably nearly the most efficient (increasing efficiency would add some clutter) way of getting an answer, but it doesn't include code to ignore spaces, count characters without regard to case, etc (easy modifications).
most_frequent(const char * str)
{
unsigned counts[256];
unsigned char * cur;
unsigned pos, max;
/* set all counts to zero */
memset(counts, 0, sizeof(counts));
/* count occurences of each character */
for (cur = (unsigned char *)str; *cur; ++cur)
++counts[*cur];
/* find most frequent character */
for (max = 0, pos = 1; pos < 256; ++pos)
if ( counts[pos] > counts[max] )
max = pos;
printf("Character %c occurs %u times.\n", max, counts[max]);
}
Create an array with your char as index.
Keep incrementing the value in the array based on the characters read.
Now get the max out of the array which gives you the most occurring char in your input.
Code will look like:
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
int main(void) {
char buf[100];
int i=0,max =0,t=0;
int a[256];
memset(a,0,sizeof(a));
fgets(buf,100,stdin);
buf[strlen(buf)-1] = '\0';
while(buf[i] != '\0')
{
a[(int)buf[i]]++;
i++;
}
i=0;
for(i=0;i<256;i++)
{
if(a[i] > max)
{
max = a[i];
t = i;
}
}
printf("The most occurring character is %c: Times: %d",t,max);
return 0;
}
Here is a solution for that, based on your own solution, and using qsort().
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
struct Frequency
{
int character;
int count;
};
int compare(const void *const lhs, const void *const rhs)
{
return ((struct Frequency *)rhs)->count - ((struct Frequency *)lhs)->count;
}
int main(int argc, char* argv[])
{
int i = 0, j = 0;
struct Frequency count[256];
memset(&count, 0, sizeof(count));
char string[100] = "Hello world";
for (i = 0 ; i < 100 ; i++)
{
for (j = 0 ; j < 256 ; j++)
{
count[j].character = j;
if (tolower(string[i]) == j)
{
count[j].count += 1;
}
}
}
qsort(count, sizeof(count) / sizeof(*count), sizeof(*count), compare);
/* skip the '\0' which was counted many times */
if (isprint(count[1].character))
printf("\nThe most popular character is: %c\n", count[1].character);
else
printf("\nThe most popular character is: \\%03x\n", count[1].character);
for (j = 0 ; j < 256 ; j++)
{
if (isprint(count[j].character))
printf("\n%c -> %d \n", count[j].character, count[j].count);
else
printf("\n\\%03x -> %d \n", count[j].character, count[j].count);
}
}
notice that the '\0' is set for all the remainig bytes in
char string[100] = "Hello world";
so the count of '\0' will be the highest.
You could use strlen() to skip '\0', in the counting loop, but don't
for (i = 0 ; i < strlen(string) ; ++i) ...
do it this way
size_t length = strlen(string);
for (i = 0 ; i < length ; ++i) ...
Lets say I have a string XYZ1-3.
I would like to convert it to a array of strings.
XYZ1,
XYZ2,
XYZ3.
is there an elegant way to do it in C?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char **expand(const char *string, int *num){//num : out var
char *id = strdup(string);
int start, end, len;
sscanf(string, "%*[A-Z]%n%d-%d", &len, &start, &end);
id[len] = '\0';
*num = end-start+1;
char **array = malloc(*num * sizeof(char*));
for(int i=0;i < *num ;++i){
len = snprintf(NULL, 0, "%s%d", id, start + i);
array[i] = malloc(++len);
sprintf(array[i], "%s%d", id, start + i);
}
free(id);
return array;
}
int main(){
int n;
char **array = expand("XYZ1-3", &n);
for(int i=0;i<n;++i){
printf("%s\n", array[i]);
free(array[i]);
}
free(array);
return 0;
}
Allow the non-alphabetical(not A-Z) id part
#include <ctype.h>
int id_length(const char *string){
//return length of id part.
int i, len;
for(i=0;string[i];++i);
if(i==0)return 0;
for(i=i-1;isdigit(string[i]) && i>=0;--i);
if(string[i]!='-') return 0;//bad format
for(i=i-1;isdigit(string[i]) && i>=0;--i);
return i+1;
}
char **expand(const char *string, int *num){//num : out var
char *id = strdup(string);
int start, end, len;
len = id_length(string);
sscanf(string+len, "%d-%d", &start, &end);
id[len] = '\0';
*num = end-start+1;
char **array = malloc(*num * sizeof(char*));
for(int i=0;i < *num ;++i){
len = snprintf(NULL, 0, "%s%d", id, start + i);
array[i] = malloc(++len);
sprintf(array[i], "%s%d", id, start + i);
}
free(id);
return array;
}
Try this--
#include<stdio.h>
#include<conio.h>
#include<string.h>
void main()
{
int len,i,c,d,p,j;
char arr[50];
char arr2[50];
char arr3[30][30];
char temp[30];
scanf("%s",arr);
len=strlen(arr);//calculating length of entire input
for(i=0;i<len;i++)
{
if(arr[i]!='-')
arr2[i]=arr[i];//arr2[] will hold the string without the numeral
else
break;
}
c=(int)arr[i-1]-48;//char is converted into int
d=(int)arr[i+1]-48;
for(i=0;i<len-3;i++)
temp[i]=arr2[i];
p=0;
for(i=c;i<=d;i++)
{
temp[len-3]=(char)(i+48);//int is converted into character
for(j=0;j<=len-3;j++)
arr3[p][j]=temp[j];//this 2d array holds array of strings
p++;
}
for(i=0;i<=(d-c);i++)
{
for(j=0;j<=len-3;j++)
{
printf("%c",arr3[i][j]);//printing the strings one by one
}
printf("\n");
}
getch();
}
Let's say I have a string "abcd1234efgh". I want to split it into substrings of length 4, like:
abcd
1234
efgh
My C is rusty. Here's what I wrote:
#include<stdio.h>
#include<string.h>
int main(void){
int i,j;
char values[32]="abcd1234efgh";
char temp[10];
for(i=0;values[i]!='\0';){
for (j=0;j<4;j++,i++){
temp[i]=values[j];
printf("%c\n",values[j]);
}
printf("string temp:%s\n",temp);
}
return 0;
}
The output is obviously wrong because I'm not saving the index of the original string. Any tips on how to fix this? For strings with a length that is not a multiple of 4, I would like to pad the short substring with spaces.
This should do the trick if you're seeking to print only:
int len = strlen(values);
for (int off = 0; off < len; off += 4)
printf("%.4s\n", values+off);
If you want to do something else (as well) with the groups of 4, then I'd consider:
int len = strlen(values);
for (int off = 0; off < len; off += 4)
{
strncpy(temp, values+off, 4);
temp[4] = '\0';
…do as you will with temp…
}
NOTE : the code is to print in group of 4 and not break and store the string if size 4
if this is what you asked for
#include<stdio.h>
#include<string.h>
int main(void)
{
int i;
char values[32]="abcd1234efgh";
for(i=0;values[i]!='\0';)
{
if( i % 4 == 0 ) printf("\n");
printf("%c",values[i]);
}
return 0;
}
This should do the trick
#include <stdio.h>
#include <string.h>
int main() {
char *str = "abcd1234efgh";
size_t sub_len = 4;
size_t len = strlen(str);
size_t n = len / sub_len;
if(n * sub_len < len)
n += 1;
char temp[n][sub_len+1];
int i;
for (i = 0; i < n; ++i){
strncpy(temp[i], str + i*sub_len, sub_len);
temp[i][sub_len]='\0';
printf("string temp:%s\n", temp[i]);
}
return 0;
}
#include<stdio.h>
#include<string.h>
int main(void){
int i,j;
char values[32]="abcd1234efgh12";
char temp[10];
for(i=0;values[i]!='\0';){
for (j=0;j<4;j++,i++){
temp[j]=values[i];
}
while(j<4)
{
temp[j]=' ';
}
temp[j]='\0';
printf("string temp:%s\n",temp);
}
return 0;
}