Reputation: 45
#include <stdio.h>
#include <string.h>
int main()
{
char a[250];
char c1[1],c2[1];
int n,i;
printf("Give text: ");
gets(a);
printf("Give c1: ");
gets(c1);
printf("Give c2: ");
gets(c2);
n=strlen(a);
for(i=0;i<n;i++)
{
if(a[i]==c1)
{
a[i]=c2;
}
if(a[i]==c2)
{
a[i]=c1;
}
}
printf("%s",a);
return 0;
}
In a text I need to switch c1
with c2
and reverse,
but when I start the program after I give a, c1
, c2
nothing happened.
Where am I wrong?
Upvotes: 0
Views: 101
Reputation: 134396
First of all, don't use gets()
, it's inherently dangerous, use fgets()
instead.
On top of that, when you used gets(c1)
, c1
being an one-element array, you already overrun the allocated memory which invokes undefined behavior.
That said, you have c1
and c2
as one-element arrays, which are not wrong but neither required. Define them as simple char
variables
char c1;
char c2;
and use them like
scanf(" %c", &c1); // mind the space and don't forget to to check the return
scanf(" %c", &c2); // value of scanf() to ensure proper scanning.
After that, the check for a[i] == c2
should come as else
construct, otherwise, you'll be overwriting the previous operation. Something like
for(i=0;i<n;i++)
{
if(a[i]==c1)
{
a[i]=c2;
}
else if(a[i]==c2)
{
a[i]=c1;
}
}
Upvotes: 2
Reputation: 75062
gets()
shouldn't be used because it has unavoidable risk of buffer overrun, is deprecated in C99 and is removed from C11.c1
and c2
have insufficient buffer size.c1
and c2
before compareing to retrieve characters read.else if
, or the modified character will be modified again.Try this:
#include <stdio.h>
#include <string.h>
/* this is a simple implementation and the buffer for \n is wasted */
char* safer_gets(char* buf, size_t size){
char* lf;
if (fgets(buf, size, stdin) == NULL) return NULL;
if ((lf = strchr(buf, '\n')) != NULL) *lf = '\0';
return buf;
}
int main()
{
char a[250];
char c1[4],c2[4]; /* need at least 3 elements due to the inefficient implementation of safer_gets */
int n,i;
printf("Give text: ");
if(safer_gets(a, sizeof(a)) == NULL)
{
fputs("read a error\n", stderr);
return 1;
}
printf("Give c1: ");
if(safer_gets(c1, sizeof(c1)) == NULL)
{
fputs("read c1 error\n", stderr);
return 1;
}
printf("Give c2: ");
if(safer_gets(c2, sizeof(c2)) == NULL)
{
fputs("read c2 error\n", stderr);
return 1;
}
n=strlen(a);
for(i=0;i<n;i++)
{
if(a[i]==*c1)
{
a[i]=*c2;
}
else if(a[i]==*c2)
{
a[i]=*c1;
}
}
printf("%s",a);
return 0;
}
Upvotes: 0