Solved

C Programming, assigning strings to char

Posted on 2010-11-20
7
2,278 Views
Last Modified: 2012-05-10
Hi All,

I had once learned some programming years ago, but almost can't remember how to program anymore. And now I am trying to pick up  c programming again from the begining... and are stuck on how to assigning text to a variable.

Can anyone tell me why I get an error when I run something like the following in a program?  Thanks.

warning: In function ‘main’:
test1.c:57: warning: assignment makes integer from pointer without a cast



void main()
{
     int m;
     char mon;

     m=1;

     if(m==1)
     {
          mon="January";
     }

     printf("Month is:  \n",mon);
}
0
Comment
Question by:wingkchan
7 Comments
 
LVL 53

Accepted Solution

by:
Infinity08 earned 150 total points
ID: 34178872
char is a single character.

A string consists of several characters, so either you make it an array of characters :

        char str[16];    /* can hold a string of up to 15 characters */

or you use a pointer to char, and let it point to a string in memory :

        char* str;    /* can point to a string in memory */

For your specific code example, you could do :
int main(void)                /* <--- correct signature of main ! */

{

     int m;

     const char* mon;         /* <--- const char* can safely point to a string literal */



     m=1;



     if(m==1)

     {

          mon="January";

     }



     printf("Month is:  %s\n",mon);    /* <--- the %s is there to actually print the string */



     return 0;                 /* <--- return an int at the end */

}

Open in new window

0
 
LVL 2

Author Comment

by:wingkchan
ID: 34178915
Thanks infinity08 for your quick response... sorry, I am really a novice programming.  when I changed my "char mon[16]" , and then run gcc to compile my program, I get the following messages.

test1.c: In function ‘main’:
test1.c:57: error: incompatible types when assigning to type ‘char[16]’ from type ‘char *’

did i do it wrong?

If you don't mind, let me share my codes with you... it's an assignment of converting the 3 number arguments (year month day), and then outputs them in american date format.  I had worked on it for a day...  although i know the logic and programming flow is very beginner like ...
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define PROGRAM_NAME            "printdate"
#define CORRECT_INPUT_COUNT     4


void main(int argc, char *argv[])
{

        int y;
        int m;
        int d;
        char mon,

/* Check # of input arugments*/

        if(argc != CORRECT_INPUT_COUNT)
        {
                printf("Usage: printdate year month day\n");
                exit(-1);
        }
/* Check year, month, day arguments*/

        if(sscanf(argv[1],"%d", &y)<1)
        {
                printf("Error: year must be a number.\n");
                exit(-2);
        }

        else if(sscanf(argv[2],"%d", &m)<1)
        {
                printf("Error: month must be a number.\n");
                exit(-3);
        }

        else if(sscanf(argv[3],"%d", &d)<1)
        {
                printf("Error:  day must be a number.\n");
                exit(-4);
        }
 else

        if(sscanf(argv[2],"%d", &m)==1)
        {
                mon = "Jan";
        }


                printf("%d-",m );
                printf("%d-",d, ",");
                printf("%d\n",y);

        
                printf("%d-",m );
                printf("%d-",d, ",");
                printf("%d\n",y);

/* Checks for leapyear */     
/*      if(y % 400 == 0)
        {
                printf("Leap Year.\n");
        }
        else if(y % 100 == 0)
        {
                printf("Not Leap Year.\n");
        }
  else if(y % 4 == 0)
        {
                printf("Leap Year.\n");
        }
        else
                printf("Not Leap Year.\n");
*/

Open in new window

0
 

Expert Comment

by:mbseddigh
ID: 34178930
"January" is an array of characters and C compiler holds it as a pointer but mon is a character.
In this assinment Compiler tries to convert a pointer to a character so it shows a warning.
you can use below code:

   
char mon[100] = "September";
    ....
    if (m == 1)
    {
        strcpy (mon, "January");
    }

Open in new window

0
U.S. Department of Agriculture and Acronis Access

With the new era of mobile computing, smartphones and tablets, wireless communications and cloud services, the USDA sought to take advantage of a mobilized workforce and the blurring lines between personal and corporate computing resources.

 
LVL 9

Assisted Solution

by:masheik
masheik earned 100 total points
ID: 34179006
Hi, see the following code with comments,


#include <stdio.h>
#include <stdlib.h>
//#include <stdbool.h>

#define PROGRAM_NAME            "printdate"
#define CORRECT_INPUT_COUNT     4


void testmain(int argc, char *argv[])
{

        int y;
        int m;
        int d;
        char mon[15]; //Missed the semicolon here

/* Check # of input arugments*/

        if(argc != CORRECT_INPUT_COUNT)
        {
                printf("Usage: printdate year month day\n");
                exit(-1);
        }
/* Check year, month, day arguments*/

        if(sscanf(argv[1],"%d", &y)<1)
        {
                printf("Error: year must be a number.\n");
                exit(-2);
        }

        else if(sscanf(argv[2],"%d", &m)<1)
        {
                printf("Error: month must be a number.\n");
                exit(-3);
        }

        else if(sscanf(argv[3],"%d", &d)<1)
        {
                printf("Error:  day must be a number.\n");
                exit(-4);
        }
 else

        if(sscanf(argv[2],"%d", &m)==1)
        {
                //mon = "Jan";
			strcpy(mon,"jan");//use string copy strcpy(destination,source)
        }
printf("mon = %s\n",mon);

                printf("%d-",m );
                printf("%d-",d, ",");
                printf("%d\n",y);


                printf("%d-",m );
                printf("%d-",d, ",");
                printf("%d\n",y);

/* Checks for leapyear */
/*      if(y % 400 == 0)
        {
                printf("Leap Year.\n");
        }
        else if(y % 100 == 0)
        {
                printf("Not Leap Year.\n");
        }
  else if(y % 4 == 0)
        {
                printf("Leap Year.\n");
        }
        else
                printf("Not Leap Year.\n");
*/
}

int main(int argc,char *argv[])
{
	testmain(argc,argv);
	getchar();
}

Open in new window

0
 
LVL 53

Expert Comment

by:Infinity08
ID: 34179018
>> test1.c:57: error: incompatible types when assigning to type ‘char[16]’ from type ‘char *’

String assignment doesn't exist in C. You cannot assign a string to another.

What you can do, is assign a pointer to a string to another pointer to a string. Like in the example code I posted in my previous post.


>> 45:            if(sscanf(argv[2],"%d", &m)==1)

sscanf returns the amount of succesfully read tokens. So, if it returns 1 in this case, it means the sscanf succeeded (because it needed to read one %d token, and it did so). So, it's good to check for success in this way.

However, you will still have to check the actual value in m to know which month it is.


In any case :

>> 15:            char mon,

if you change this to be a const char* instead of a char (see the code snippet in my earlier post), it should work better.

Note also that there's a comma at the end of that line, while it should be a semicolon.
0
 
LVL 2

Author Comment

by:wingkchan
ID: 34179227
Thanks all for your input and comments.  especially for the breakdown descriptions.   Actually, i am still unfamiliar with pointers, char syntax.... but nevertheness, with infinity08's code, I did get pass with matching the mon(integer) to text for now... let me keep on writing it.  will return back shortly.  thanks.
0
 
LVL 2

Author Closing Comment

by:wingkchan
ID: 34181423
Thanks again for the input.  Storing the words in pointer solved the problem!  =)
0

Featured Post

NAS Cloud Backup Strategies

This article explains backup scenarios when using network storage. We review the so-called “3-2-1 strategy” and summarize the methods you can use to send NAS data to the cloud

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Preface I don't like visual development tools that are supposed to write a program for me. Even if it is Xcode and I can use Interface Builder. Yes, it is a perfect tool and has helped me a lot, mainly, in the beginning, when my programs were small…
This is a short and sweet, but (hopefully) to the point article. There seems to be some fundamental misunderstanding about the function prototype for the "main" function in C and C++, more specifically what type this function should return. I see so…
The goal of this video is to provide viewers with basic examples to understand how to use strings and some functions related to them in the C programming language.
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use for-loops in the C programming language.

911 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

16 Experts available now in Live!

Get 1:1 Help Now