I'm somehow having issues parsing command-line arguments on Windows in C++.
I tried using this
int main(int argc, char **argv)
{
std::cout << "Command-line argument count: " << argc << " \n";
std::cout << "Arguments:\n";
for (int i = 0; i < argc; i++)
std::cout << " argv[" << i << "] "
<< argv[i] << "\n";
return 0;
}
as well as this
int main(int argc, char *argv[])
{
std::cout << "Command-line argument count: " << argc << " \n";
std::cout << "Arguments:\n";
for (int i = 0; i < argc; i++)
std::cout << " argv[" << i << "] "
<< argv[i] << "\n";
return 0;
}
The variables argc and argv seem to be somehow uninitialized.
That's what launching the program returns to me:
Z:\Dev\ProcessSuspender\Debug>ProcessSuspender a
Command-line argument count: 2130558976
Arguments:
argv[0]
argv[1] ╠ÉÉÉÉÉj↑h╚♂YwÞØ÷■ âe³
argv[2]
(crash following)
I compiled it with MSVC12 using the /SUBSYSTEM:CONSOLE linker option.
What could be the cause of this issue?
I've manually set the entry point to main. Whether I use the default project setting (_tmain) or not, the issue persists.
In general, you should not do that unless you know the consequences. The typical values of the entry point (/ENTRY) should be either:
[w]mainCRTStartup, which calls [w]main, or
[w]WinMainCRTStartup, which calls [w]WinMain, or
_DllMainCRTStartup, which calls DllMain.
Why is this needed? Well, the …CRTStartup-family of functions do a couple crucial things, including the initialization of:
the C runtime (CRT),
any global variables, and
the arguments argc and argv, as you've accidentally found out.
So for a typical program you probably want it to do its job. In the Linux world, there is an equivalent function called _start that is needed to do the same initialization tasks as well, which can be overridden with -e while linking.
The confusion here probably stems from difference in ambiguous meaning of the word "entry point": there is the meaning of "apparent entry point" from the perspective of the language (which is main and its ilk), and the meaning of the "true entry point" from the perspective of the language implementation (which is …CRTStartup or _start).
Note that using the …CRTStartup functions is not absolutely essential, as you can certainly write a program that avoids using them. It does come with a cost, however:
you can't use the C runtime, so you can't use most of the standard library,
you need to manually initialize any global variables, and
you need to manually obtain argc and argv using the Windows API (GetCommandLineW and CommandLineToArgvW).
Some do this to avoid dependency on the CRT, or to minimize the executable size.
I tried your project on VS 2012 and it is working smoothly.
I added a getchar(); command as below:
#include <iostream>
int main(int argc, char *argv[])
{
std::cout << "Command-line argument count: " << argc << " \n";
std::cout << "Arguments:\n";
for (int i = 0; i < argc; i++)
std::cout << " argv[" << i << "] "
<< argv[i] << "\n";
getchar();
return 0;
}
so that i could see the output.
Right-click on Project -> Properties -> debugging -> Command
Arguments.
This was empty in my project and i added the character a to simulate your problem.
Here is the output i am getting:
Right click on the project -> Debug -> Start new Instance -> would you
like to build it -> yes
Output:
Command-line argument count: 2
Arguments:
argv[0] <my macines path>\helpingStack1.exe
argv[1] a
Please check this again. I hope this helps.
1) I am suspecting that your binaries are not up to date when you run this script so please do a clean build and verify that you are indeed running the same exe as the one you are building. Please check the configuration - Debug/Release.
2) go to the folder where you have created the project and righclick on the project folder, and change property -> ensure read only is not checked in the check box.
Obviously, Something is wrong with the IDE or project or maybe anything else's setup on your system only.
The code is perfect.
Have you tried directly and independently running your output exe, by executing it through command prompt ??
Run your exe with command prompt by supplying some arbitrary arguments, and check the output.
its worth to check your character set in project properties->General.
Related
I have set up a cmake project using visual studio 2019. I want to start the debug session with some command line parameters.
To achieve that, I've configured the CMakeLists.txt with the VS_DEBUGGER_COMMAND_ARGUMENTS:
set( VS_DEBUGGER_COMMAND_ARGUMENTS "this" "is" "a" "test" )
set( VS_DEBUGGER_WORKING_DIRECTORY "." )
The first thing my C++ code do is to print out that parameters:
if (argc > 1) {
// config_file = argv[1];
for (std::size_t i = 0; i < argc; i++) {
std::cout << "argument " << i << ": " << argv[i] << std::endl;
}
}
else {
std::cout << "the value of argc is: " << argc << std::endl;
}
The problem is that when I run Debug, the output I've always see is the value of argc is 1. I've also tried to modify the launch.vs.json file as appears in this related question:
Adding command line arguments to project
and it doesn't work. Any ideas?
I wrote a c++ program that can save its internal state to the disk in a file of a custom type. How can I get windows to run my program upon a file of this type being double clicked? Is there a method of passing arguments to main() so the program knows what file was selected?
If you use "Run with..." from the Windows explorer context menu, you can select your application binary.
Windows will supply the absolute file path as the first argument to your application.
int main(int argc, char **argv)
{
if (argc < 2)
std::cout << "No argument" << std::endl;
else
std::cout << "Filename is " << argv[1] << std::endl;
}
Why 2 arguments? Because arguments always start in argv[1]. argv[0] usually contains the path to your application binary.
If you call "d:\MyApp.exe c:\MyImage.bmp" then
argc == 2
argv[0] == "d:\MyApp.exe"
argv[1] == "c:\MyImage.bmp"
I try to pass some arguments to the program using Visual Studio Community 2015.
I add some input in the Configuration Properties - Debugging - Command Arguments.
#include <iostream>
int main(int args, char* argv[])
{
std::cout << "args:" << args << std::endl;
for (size_t i = 0; i < args; i++)
{
std::cout << "argv[" << i << "]=" << argv[i] << std::endl;
}
}
The output is:
args:1
argv[0]=c:\users\john\documents\visual studio 2015\Projects\ConsoleApplication2\Debug\ConsoleApplication2.exe
Why the input in the "Command Arguments" field is ignored?
Are you sure the build configuration you set the command line for is the one you are running? VS allows different command line arguments to be set for each build (debug/release and platforms by default).
I'm working on a (C++) program that more or less revolves around renaming files. I would like to make it so that you can select a file, right-mouse click it and select "Open With" and then select my application.
I got the context menu part figured out, I just don't know how to do the C++ part.
In other words, how to make a program (in C++) that can be opened together with a file (so by context menu or directly opening it) and process this file?
Example:
In my Windows, I associate the ".roberto" extension with "C:\Program Files\MyProgram\MyProgram.exe". So if I open a ".roberto" file, a command prompt pops up, only displaying the name of the selected file.
I hope this is clear, I am not sure how to explain this. I also had some trouble with searching on this question, so please forgive me if this has been asked before.
Thanks.
On Windows platform in MFC-based application this is done automatically by framework in InitInstance() method of your application class:
EnableShellOpen();
RegisterShellFileTypes(TRUE);
IMPORTANT: In general this functionality is framework dependent and OS speicific.
I figured it out!
Using the arguments given to main was the clue. The following program prints one line if opened directly, this line is the path of the program itself, and if opened with the 'Open with...' options it also shows the selected file.
#include "stdafx.h"
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
cout << "Argument count: " << argc << endl << endl;
for (int i = 0; i < argc; i++)
{
cout << argv[i] << endl;
}
cout << endl << endl << endl << endl;
system("pause");
return 0;
}
I am facing some problems while working with PCRE in Code::blocks. I have downloaded PCRE from here. And did all the steps mentioned here. However I am getting a pcr3.dll missing error during execution.
The program can't start because pcre3.dll is missing from your
computer. Try reinstalling the program to fix this problem.
My code:
#include <iostream>
#include <regex.h>
using namespace std;
int main(){
regex_t reg;
string pattern = "[^tpr]{2,}";
string str = "topcoder";
regmatch_t matches[1];
regcomp(®,pattern.c_str(),REG_EXTENDED|REG_ICASE);
if (regexec(®,str.c_str(),1,matches,0)==0) {
cout << "Match " ;
cout << str.substr(matches[0].rm_so,matches[0].rm_eo-matches[0].rm_so) ;
cout << " found starting at: " ;
cout << matches[0].rm_so ;
cout << " and ending at " ;
cout << matches[0].rm_eo ;
cout << endl;
} else {
cout << "Match not found.";
cout << endl;
}
regfree(®);
return 0;
}
I am not sure how to fix this, any ideas?
PS: Above mentioned code is taken from this tutorial.
Copy the DLL to the same directory as the executable that you are running. If that works, you didn't install the DLL correctly or at least not in a way that it can be found by the programs in general. Check out the documentation of the DLL Search Order to get an idea how else you can make the system find the DLL. In particular, you need to know that there is a linker and a loader (aka dynamic/runtime linker/loader), but only one of them is configured inside CodeBlocks!