Logical Error With Type Conversion In C


 
Thread Tools Search this Thread
Top Forums Programming Logical Error With Type Conversion In C
# 1  
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.
# 2  
Old 08-20-2018
Code:
for (j = 0; j < data[INPUT_BUFF]; j++){

This is wrong.

Code:
for (j = 0; data[j] != 0; j++){

This is probably what you want.

Code:
switch(data[j]){
    case 0: 
    ...
    case 1:
    ...
    case 2:
    ...

This is wrong.

Code:
switch(data[j]){
    case 'm':
    ...
    case 'o':
    ...
    case 'n':
    ...
    case 'e':
    ...

This might be more like what you want... Maybe. I don't really understand your train of thought.

Code:
atoi(data);

This is wrong. It does absolutely nothing at all.

Code:
data[j] = ranit(m_array);

This might be wrong. What is m_array?
This User Gave Thanks to Corona688 For This Post:
# 3  
Old 08-20-2018
Very odd. I had tried using letters in place of the numbers I had in the switch/case before, but I could not get it to work. Now it works with the exert I provided earlier. I didn't show in that exert, but I also included digits, letters and special characters with the rest of the code. Perhaps I just didn't escape some special character properly, but I can come back to that later.

If I print out the m_array with something like this:

Code:
for (i = 0; i < DATA_SIZE; i++){
            printf("%x\n", m_array[i]);
    }


I get back an array of random numbers that I generated from another function:

Code:
 ./test | tail 
8885ffc9
77a822d5
bf34d05d
bc229af3
fc171fb9
ab7d3609
4815ef59
83facdc3
7d77bf58
881d17ea


Then I have another function that should randomly select an element from that array, or for any of the arrays from characters that match, and use one number to replace the letter given. Sorry if that wasn't clear.

With using the characters in the switch/case I guess the whole conversion of char arrays to ints won't be needed. I could just create a new array with the numbers that are switched for the letters I guess.


I'm sure you're right about this part, but I'd like to understand why:

Code:
data[j] = ranit(m_array);


That function should just grab one random element that's a number from the m_array. I guess I'm assigning it wrong there?
# 4  
Old 08-21-2018
Quote:
Originally Posted by Azrael
Very odd. I had tried using letters in place of the numbers I had in the switch/case before, but I could not get it to work.
Single and double quotes are very different things in C. In C, "A" means a string -- amounting to the array { 'A', '\0' }. And 'A' is just the number 65.

Quote:
If I print out the m_array with something like this:

Code:
for (i = 0; i < DATA_SIZE; i++){
            printf("%x\n", m_array[i]);
    }


I get back an array of random numbers that I generated from another function:

Code:
 ./test | tail 
8885ffc9
77a822d5
bf34d05d
bc229af3
fc171fb9
ab7d3609
4815ef59
83facdc3
7d77bf58
881d17ea

Then I have another function that should randomly select an element from that array, or for any of the arrays from characters that match, and use one number to replace the letter given. Sorry if that wasn't clear.
Numbers that large won't fit in your input array. chars are numbers, but their range is only -128 through +127. It'll work fine if you use a separate array of type 'int' output.
# 5  
Old 08-21-2018
Quote:
Originally Posted by Corona688
Single and double quotes are very different things in C. In C, "A" means a string -- amounting to the array { 'A', '\0' }. And 'A' is just the number 65.



Numbers that large won't fit in your input array. chars are numbers, but their range is only -128 through +127. It'll work fine if you use a separate array of type 'int' output.
The POSIX standard requires that type char in the C language must be an 8-bit type. The C Standard doesn't specify whether type char is signed or unsigned. So the range of values that can be contained in a char is [-128, 127] on some POSIX conforming systems and [0, 255] on others.

On non-POSIX systems, the C standard allows the type char to be wider than 8 bits. On systems that use UTF-16 as the codeset underlying their system character sets, a char would likely be 16-bits wide.
This User Gave Thanks to Don Cragun For This Post:
# 6  
Old 08-21-2018
Thanks for correcting my too-specific answer. 16 bits is still too small for his numbers, be they signed or unsigned, so the point stands however.
# 7  
Old 08-23-2018
Thank you both for explaining why this would not work. At one time I new about the char range, but forgot. Much appreciated again!
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. 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

2. 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

3. 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

4. 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

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. 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

7. 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

8. 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

9. 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
Login or Register to Ask a Question