JohnSantaFe
asked on
Command line arguments
I'm using MS Visual Studio 2005 and creating a Windows console application. It seems to me the reading of command line arguments is not working correctly.
In the code below, argv[n] only contains the first character of the command line input.
I get the following output:
C:\myproject>test.exe 123 abc
Argument 0: t
Argument 1: 1
Argument 2: a
I expected argv to contain
test.exe
123
abc
What am I doing wrong?
Thanks.
In the code below, argv[n] only contains the first character of the command line input.
I get the following output:
C:\myproject>test.exe 123 abc
Argument 0: t
Argument 1: 1
Argument 2: a
I expected argv to contain
test.exe
123
abc
What am I doing wrong?
Thanks.
// test.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "stdio.h"
#include "string.h"
int _tmain(int argc, _TCHAR* argv[])
{
for ( int i=0; i < argc; i++ ){
printf("Argument %i: %s\n", i, argv[i]);
}
return 0;
}
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
>> Probably because you are using a TCHAR type for argv, I don't think that works.
Sure it does... Microsoft compiles will allow Wide or Narrow for argv, this is the default of how the compiler creates a project. The problem is if it's wide the 2nd bytes are most likely 0
e.g.
'A' == 0x41
L'A' == 0x4100
But %s is expecting a stream of narrow chars so when it hits the 2nd byte in the wide char it sees a null and terminates
Sure it does... Microsoft compiles will allow Wide or Narrow for argv, this is the default of how the compiler creates a project. The problem is if it's wide the 2nd bytes are most likely 0
e.g.
'A' == 0x41
L'A' == 0x4100
But %s is expecting a stream of narrow chars so when it hits the 2nd byte in the wide char it sees a null and terminates
You are right, I just looked at some UNICODE projects, and I had never even noticed argv was wide character!
_wprintf is the wide version of printf. If you use _tprintf then it will map to the wide version if you are using unicode (which is default for 2005), or to the ansi version if you are not using unicode:
http://msdn.microsoft.com/en-us/library/wc7014hz(VS.80).aspx
http://msdn.microsoft.com/en-us/library/wc7014hz(VS.80).aspx
ASKER
Well,
Switching to char* didn't work.
Using _TCHAR* and wcout worked.
But I don't quite get it. Seems like this would break a million console applications....?
Switching to char* didn't work.
Using _TCHAR* and wcout worked.
But I don't quite get it. Seems like this would break a million console applications....?
ASKER
Ah, I see, when using _tmain you get the wide version.
When I used the code below it worked as expected.
Thanks.
When I used the code below it worked as expected.
Thanks.
#include "stdafx.h"
#include "stdio.h"
#include "string.h"
int main(int argc, char* argv[]) //note changed from _tmain()
{
for ( int i=0; i < argc; i++ ){
printf("Argument %i: %s\n", i, argv[i]);
}
return 0;
}
>> But I don't quite get it. Seems like this would break a million console applications....?
Wide chars (in Windows) are 2 bytes and narrow are 1. Most of the standard narrow ASCII chars map to wide chars by just setting byte 0 to be the same as the narrow value and byte 1 to 0x00. This is a null char and since C functions user null to signify the end of a string that's why you only see the first char.
When you try and printf L'A' it see 2 chars, 'A' and '\0'
Wide chars (in Windows) are 2 bytes and narrow are 1. Most of the standard narrow ASCII chars map to wide chars by just setting byte 0 to be the same as the narrow value and byte 1 to 0x00. This is a null char and since C functions user null to signify the end of a string that's why you only see the first char.
When you try and printf L'A' it see 2 chars, 'A' and '\0'
>>Ah, I see, when using _tmain you get the wide version.
You and I both, I also did not notice _tmain before responding so I learned something as well.
You and I both, I also did not notice _tmain before responding so I learned something as well.
ASKER
Thanks for the help.
Try:
int _tmain(int argc, char* argv[])
{
for ( int i=0; i < argc; i++ ){
printf("Argument %i: %s\n", i, argv[i]);
}
return 0;
}
I will look it up, but I think the standard requires argv to be a standard char **