hey this code is working. the code is about taking name input and doing some change with it.
#include <stdio.h>
#include <stdlib.h>
/*
* An example of how to use strtol() to read a number
* and validate that one was entered correctly.
*
*/
int main(void)
{
char buf[BUFSIZ];
char *p;
long int i;
printf ("Enter a number: ");
if (fgets(buf, sizeof(buf), stdin) != NULL)
{
i = strtol(buf, &p, 10);
/*
* If the first character of the buffer is \n, the user
* pressed [Enter] with entering any text at all, which
* is therefore invalid.
*
* The pointer p has been updated by strtol() to point to
* the first invalid character after the number.
* If this character is \0 it means we reached the end of
* the array successfully, so we received a good number.
* If this character is \n it also means we reached the
* end of the input successfully. This is a symptom of
* using fgets() to obtain the string, but does not
* represent a problem.
* If this character is anything else, it means there was
* some additional characters entered after the number.
* In this sample program, I have deemed this situation
* to be invalid, however, in your program it may be
* valid, depending on what you're expecting from the user.
*
*/
if (buf[0] != '\n' && (*p == '\n' || *p == '\0'))
printf ("Valid number of %ld entered\n", i);
else printf ("Invalid number entered\n");
}
return(0);
}
this code is also working! it takes a string and converts into an integer!
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
int m;
char name[m],rename[m],c=0,j=0;
puts("enter your name\n");
gets(name);
m=strlen(name);
if(m>20){
while(m>20){
puts("shorter name pls\n");
gets(name);
m=strlen(name);
}
}
while(name[c]==' '){
c++;}
while(c<strlen(name)){
if(name[c]==' '&& name[c+1]==' ')
{c++;}
else{
rename[j]=name[c];
j++;
c++;}
}
rename[j]='\0';
puts(rename);
return 0;
}
but while typing them together in the same program, the program is crashing!
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
int m;
char name[m],rename[m],c=0,j=0;
puts("enter your name\n");
gets(name);
m=strlen(name);
if(m>20){
while(m>20){
puts("shorter name pls\n");
gets(name);
m=strlen(name);
}
}
while(name[c]==' '){
c++;}
while(c<strlen(name)){
if(name[c]==' '&& name[c+1]==' ')
{c++;}
else{
rename[j]=name[c];
j++;
c++;}
}
rename[j]='\0';
puts(rename);
char buf[BUFSIZ];
char *p;
long int i;
printf ("Enter a number: ");
if (fgets(buf, sizeof(buf), stdin) != NULL)
{
i = strtol(buf, &p, 10);
/*
* If the first character of the buffer is \n, the user
* pressed [Enter] with entering any text at all, which
* is therefore invalid.
*
* The pointer p has been updated by strtol() to point to
* the first invalid character after the number.
* If this character is \0 it means we reached the end of
* the array successfully, so we received a good number.
* If this character is \n it also means we reached the
* end of the input successfully. This is a symptom of
* using fgets() to obtain the string, but does not
* represent a problem.
* If this character is anything else, it means there was
* some additional characters entered after the number.
* In this sample program, I have deemed this situation
* to be invalid, however, in your program it may be
* valid, depending on what you're expecting from the user.
*
*/
if (buf[0] != '\n' && (*p == '\n' || *p == '\0'))
printf ("Valid number of %ld entered\n", i);
else printf ("Invalid number entered\n");
}
return 0;
}
why??
There are several things that don’t look good in this program, even before you merged the two.
Then, the gets() function should be avoided because it is possible to feed to it more data than it is prepared to accept, thereby crashing your program. If m were initialized to zero, any input of any length would be liable to trigger a crash.
Changing the first lines makes it work:
…but if you entered a name longer than m, you would again have a crash.
Just setting the value of m will cause a crash if the name is longer than the smaller of m and 127. Say you have m = 200 and enter a name containing 130 spaces: then this line
while(name[c]==’ ‘){
c++;}
would increase c until it is 126, then 127, then finding that name[127] is a space would increase c again. But c is a char, and c+1 is therefore not 128, but -128. When converted to memory address to index ‘name’, that -128 points somewhere in outer space, and the program goes down in flames.
HINT: when you compile the program and are not yet an expert, keep all compiler warnings to their highest settings. When you’re an expert, you’ll be able to turn them off — and will have learned not to want to :-).
GCC ran on your first source says: