Sponsored Content
Top Forums Programming Logical Error With Type Conversion In C Post 303021887 by Azrael on Monday 20th of August 2018 12:07:39 AM
Old 08-20-2018
Logical Error With Type Conversion In C

So, I'm into about 650 lines of some code I'm working on. So I'll try to explain instead of flooding this post. Say I have some code like this:

Code:
int main() {
    int i, j;
    char data[INPUT_BUFF];

    printf("Gimme something: ");
    fgets(data, INPUT_BUFF, stdin);

    for (j = 0; j < data[INPUT_BUFF]; j++){
    switch(data[j]){
    case 0: 
        if(j == 'e'){
            atoi(data);
            data[j] = ranit(e_array);
            sprintf( data, "%d", data );
        }
    case 1: 
        if(j == 'm'){
            atoi(data);
            data[j] = ranit(m_array);
            sprintf( data, "%d", data );
        }
    case 2: 
        if(j == 'n'){
            atoi(data);
            data[j] = ranit(n_array);
            sprintf( data, "%d", data );
        }
    case 3: 
        if(j == 'o'){
            atoi(data);
            data[j] = ranit(o_array);
            sprintf( data, "%d", data );
        }
    case 4: 
        if(j == 'y'){
            atoi(data);
            data[j] = ranit(y_array);
            sprintf( data, "%d", data );
        }

     }
     }

     for (i = 0; i < INPUT_BUFF; i++){
         printf("%x\n", (int)data[(int)i]);
     }

     return 0;
}

I have a switch statement in the above that only checks for the characters in the word 'money'. The entire alphabet would have been too much to put here. The function ranit() grabs a random element out of the array it is past. That function has been checked and works perfect. In the case all the elements are numbers. I've tried to do this a lot of different ways, but what I want to do is after checking for a matching character, replace it with a random element in from the corresponding arrays that contain integers.

I tried using atoi() to make the 'data' character array able to hold integers. That way I wouldn't get an error about mismatching types. At some point I could have sworn itoa worked with gcc, but I now see this is no longer part of the standard library. I tried using sprintf() to convert the data array back to chars for the next iteration of the loop.

When I run the code I notice the random numbers aren't displayed, but the hex equivalents for the ascii values of the word 'money':

Code:
$ ./test 
Gimme something: money
6d
6f
6e
65
79

I'm unsure if I'm assigning the values wrong or if sprintf won't allow for the same source and destination values. All the examples I found would put this in a new variable or array name, but I need to have it in the same for the next loop iteration. So maybe I should be using something else?

No warnings or errors from the compiler. Just strictly a logical error at this point. Any suggestions much appreciated.
 

9 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

Error in creating logical partition

Dear Members, I am using SCO-Unix 5.0.5. I have created 2 logical drives but some of the blocks are overlapped and are now giving warning during startup. I have used fsck to settle the problems but to no avail. Kindly help me to sort out the problem. Thanks (3 Replies)
Discussion started by: nagendrajaiswal
3 Replies

2. Shell Programming and Scripting

Does KSH support data type conversion?

Hello,everyone here. I'm coding with KSH to achieve exploring the disk space and judging whether it closes to overflow.But It seems that no one way to convert a string variable to integer. df | read A B C D E F G H I J K L print ${L} Can I convert L to integer type? Thanks for... (2 Replies)
Discussion started by: joshuaduan
2 Replies

3. Shell Programming and Scripting

error during run: St9bad_alloc - Getting this error while using some conversion progr

Hi all, It will be very useful If you spare some time with me for this worrying error. I am calling a conversion program which is written in C++ for converting a file format to different format. It was working fine for this past 2 yrs. But now it is not working since the file size has been... (1 Reply)
Discussion started by: sathu_pec
1 Replies

4. AIX

Type of Logical Volume lost after vgexport/gvimport process

Hi, I have the next doubt about of lost of characteristic of LV in my original configuration # lsvg -l ifxvg ifxvg: LV NAME TYPE LPs PPs PVs LV STATE MOUNT POINT aw64m_01 jfs 1 1 1 open/syncd N/A aw64m_02 jfs 1... (1 Reply)
Discussion started by: cerber0
1 Replies

5. UNIX for Dummies Questions & Answers

Build Error: error: dereferencing pointer to incomplete type

I'm getting the following Error: prepare_pcap.c: In function `prepare_pkts': prepare_pcap.c:127: error: dereferencing pointer to incomplete type prepare_pcap.c:138: error: dereferencing pointer to incomplete type ==================================== This is the part of the relevant... (8 Replies)
Discussion started by: katwala
8 Replies

6. Shell Programming and Scripting

Logical error

I have this script to uvscan-update. Seems like that i am getting logical error at the end of the script. It is updating the script and also giving the error message to update it manually. I have deleted the DAT files to see if it will create new and it does. Below is the error and the script: ... (1 Reply)
Discussion started by: mk07md
1 Replies

7. Shell Programming and Scripting

Military type format date/time conversion

Hello All, I have a requirement to convert a 12 hour format to 24 hour time format and the sample input /out put is below Input Time format : Nov 2 2011 12:16AM Out Put Format : Nov 2 2011 0:16 Input : Nov 2 2011 4:16PM Out Put: Nov 2 2011 16:16 I have done this using a... (6 Replies)
Discussion started by: jambesh
6 Replies

8. Programming

type conversion C, atoi()

In the book "The C programming language"; second edition, chapter 2.7 there is a snippet which is supposed to: "convert a string of digits into its numeric equivalent". int atoi(char s) { int i, n; n = 0; for ( i = 0; s >= '0' && s <= '9'; ++i) n = 10 * n + (s -... (4 Replies)
Discussion started by: tornow
4 Replies

9. Shell Programming and Scripting

Logical if error

Hi All, I am writing a simple script to read a file and display the lines with char count between 20 and 25. I am stuck with the if condition here. Tried a lot but still getting an error on the if condition # if && if && My script is very simple as below, not able to understand... (7 Replies)
Discussion started by: nss280
7 Replies
atoi(3) 						     Library Functions Manual							   atoi(3)

NAME
atoi, atol, strtol, strtoul - Convert a character string to the specified integer data type LIBRARY
Standard C Library (libc.a) SYNOPSIS
#include <stdlib.h> int atoi( const char *nptr); long int atol( const char *nptr); long int strtol( const char *nptr, char **endptr, int base); unsigned long int strtoul( const char *nptr, char **endptr, int base); PARAMETERS
Points to the character string to convert. Points to a pointer in which the function stores the position in the string specified by the nptr parameter where a character is found that is not a valid character for the purpose of this conversion. Specifies the radix to use for the conversion. DESCRIPTION
The atoi(), atol(), strtol(), and strtoul() functions are used to convert a character string pointed to by the nptr parameter to an integer having a specified data type. The atoi() and atol() functions convert a character string containing decimal integer constants, but the strtol() and strtoul() functions can convert a character string containing a integer constant in octal, decimal, hexadecimal, or a base specified by the base parameter. The atoi() function converts the character string pointed to by the nptr parameter, up to the first character inconsistent with the format of a decimal integer, to an integer data type. Leading white-space characters are ignored. A call to this function is equivalent to a call to strtol(nptr, (char**) NULL, 10). The int value of the input string is returned. The atol() function converts the character string pointed to by the nptr parameter, up to the first character inconsistent with the format of a decimal integer, to a long integer data type. Leading white-space characters are ignored. A call to this function is equivalent to a call to strtol(nptr, (char**) NULL, 10). The long int value of the input string is returned. The strtol() function converts the initial portion of the character string pointed to by the nptr parameter to a long integer representa- tion. The input character string is first broken down into three parts: White space -- an initial (possibly empty) sequence of spaces (as specified by the isspace() function) Subject sequence -- a sequence of characters that are valid in an integer constant of the radix deter- mined by the base parameter Unrecognized characters -- final sequence of unrecognized character codes, including the terminating null char- acter If possible, the subject is then converted to a long integer and the result is returned. The base parameter can take values between 0 and 36. If the base value is 0 (zero), the subject string can be a decimal, octal, or hexa- decimal integer constant. A decimal constant begins with a nonzero digit, and consists of a sequence of decimal digits. An octal constant consists of the prefix 0 (zero) optionally followed by a sequence of digits in the range 0 through 7. A hexadecimal constant consists of the prefix 0x or 0X followed by a sequence consisting of decimal digits and the letters in the range a (or A) to f (or F). If the base value is between 2 and 36, the subject string can be a sequence of digits and letters a (or A) to z ( or Z ) that are used to represent an integer in the specified base. Alphabetic characters represent digits with an equivalent decimal value from 10 (for the letter A) to 35 (for the letter Z). The subject string can only have digits with a value less than base and alphabetic characters with equivalent values less than base. For example, when the value of the base parameter is 20, only the following value assignments are converted: Character 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J a b c d e f g h i j Value 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 The subject string can optionally be preceded by a + (plus sign) or - (minus sign), but cannot include an integer suffix (such as L). If the subject string is preceded by a - (minus sign), the converted integer value has a negative value. If the value of base is 16, the characters 0x or 0X may optionally precede the sequence of letters or digits, following the sign, if present. The character string is parsed to skip the initial space characters (as determined by the isspace() function). Any nonspace character is the starting of a potential subject string that may form an integer in the base specified by the base parameter. The subject sequence is defined to be the longest initial substring that is of the expected form of long integer. Any character that does not satisfy this expected form begins the final sequence of unrecognized characters. The strtol() function sets the location pointed to by the endptr parameter to point to this final sequence of unrecognized characters except when endptr is a null pointer. The LC_CTYPE category of the locale controls what characters are treated as spaces but does not effect the interpretation of characters as part of the subject string. The characters in the subject string are always treated as if the locale was the C locale. The strtoul() function is the same as the strtol() function, except that strtoul() returns an unsigned long integer. EXAMPLES
The following example converts a character string to a signed long integer. #include <stdio.h> #include <stdlib.h> #include <locale.h> #include <errno.h> #define LENGTH 40 main() { char String[LENGTH], *endptr; long int retval; (void)setlocale(LC_ALL, ""); if (fgets(String, LENGTH, stdin) != NULL) { errno = 0; retval = strtol ( String, &endptr, 0 ); if (retval == 0 && (errno != 0 || String == endptr)) { /* No conversion could be performed */ printf("No conversion performed "); } else if (errno !=0 && (retval == LONG_MAX || retval == LONG_MIN)) { /* Error handling */ } else { /* retval contains long integer */ printf("Integer in decimal is %d ", retval); } } } RETURN VALUES
The atoi() function returns the converted value of an integer if the expected form is found. If no conversion could be performed, a value of 0 (zero) is returned. If the converted value is outside the range of representable values, INT_MAX or INT_MIN is returned (according to the sign of the value). The atol() and strtol() functions return the converted value of long integer if the expected form is found. If no conversion could be per- formed, a value of 0 (zero) is returned. If the converted value is outside the range of representable values, LONG_MAX or LONG_MIN is returned (according to the sign of the value). The strtoul() function returns the converted value of long integer if the expected form is found. If no conversion could be performed, a value of 0 (zero) is returned. If the converted value is outside the range of representable values, ULONG_MAX is returned. In the strtol() and strtoul() functions, if the endptr parameter is not a null pointer, the function stores a pointer to the final sequence of unrecognized characters in the object pointed to by endptr except when the subject sequence is empty or invalid. In this case, the func- tion stores the nptr pointer in the object pointed to by the endptr parameter. Since these functions return 0 (zero), INT_MIN, INT_MAX, LONG_MIN, LONG_MAX, and ULONG_MAX in the event of an error and these values are also valid returns if the function is successful, applications should set errno to 0 (zero) before calling these functions, and check errno after return from the function. If errno is nonzero, an error occurred. Additionally, for the strtol() and strtoul() functions, if 0 (zero) is returned, applications should check if the endptr parameter equals the nptr parameter. In this case, there was no valid subject string. ERRORS
If any of the following conditions occurs, the atoi(), atol(), strtol(), or strtoul() function sets errno to the corresponding value. The base parameter has a value less than 0 or greater than 36. If nptr is NULL, the functions return 0 and do not set errno. The converted value is outside the range of representable values. RELATED INFORMATION
Functions: atof(3), scanf(3), wcstol(3), wcstoul(3). delim off atoi(3)
All times are GMT -4. The time now is 01:03 AM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy