我必须编写一个基本上在 c++ 中执行 strlen() 函数的代码,我哪里出错了?
Posted
技术标签:
【中文标题】我必须编写一个基本上在 c++ 中执行 strlen() 函数的代码,我哪里出错了?【英文标题】:I have to write a code that basically performs the strlen() function in c++, where have I gone wrong? 【发布时间】:2015-03-23 06:16:10 【问题描述】:argv 数组是在调试属性中定义的,但我正在访问内存错误:'0xC0000005:访问冲突读取位置 0x00000000。
对正在发生的事情有什么想法吗?
#include "stdafx.h"
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
//TASK 2
for (int a = 0; a <= argc; a++) //counts until a = number of arguments
for (int x = 0; argv[a][x] == '\0'; x++) //counts until x = '\0'
cout << "Number of characters in argument " << argv[a] << "=" << x; //Outputs the argument and string length x
return 0;
【问题讨论】:
【参考方案1】:for (int x = 0; argv[a][x] == '\0'; x++) //counts until x = '\0'
不,实际上,中间那个条件是继续条件,而不是终止条件。
你需要这样的东西:
for (int x = 0; argv[a][x] != '\0'; x++)
此外,该循环会累积打印出长度,您可能只希望在最后得到它。
解决方案是将x
移动到外部范围并在 内部循环之后打印。
你还想只处理你给出的“真实”参数,改变:
for (int a = 0; a <= argc; a++)
进入:
for (int a = 1; a < argc; a++)
因为argv[argc]
被规定为NULL,你不想取消引用它。而argv[0]
代表程序名,你可能并不关心。
这会让你的代码看起来像:
#include <iostream>
using namespace std;
int main (int argc, char *argv[])
for (int a = 1; a < argc; a++)
int x;
for (x = 0; argv[a][x] != '\0'; x++)
;
cout << "Chars in argument '" << argv[a] << "' = " << x << '\n';
return 0;
使用testprog 1 12 123 "" 1234567890
运行该代码给出:
Chars in argument '1' = 1
Chars in argument '12' = 2
Chars in argument '123' = 3
Chars in argument '' = 0
Chars in argument '1234567890' = 10
【讨论】:
for (int a = 1; a < argc; a++)
?? a
不应该被初始化为 0 吗?
非常感谢您,在重新定义 a = 1 方面领先您一步;)不幸的是,由于我的声誉低下,我无法投票赞成您的答案...【参考方案2】:
for (int a = 0; a <= argc; a++)
// ^^
该循环将包括a[args]
(它是参数数组末尾的一个),然后取消引用它,导致未定义的行为 - 在您的情况下会导致访问冲突。当a
小于argc
时,您需要循环。
【讨论】:
谢谢,我不再收到错误,但没有输出任何内容。我在'return 0;'处有一个断点;线。根据监视窗口,argc 的值为 3,但 argv 具有红色字体的编译后的 .exe 文件的目录,该值应该在哪里。 argv 在调试属性中定义为“234 45”。知道发生了什么吗? 你检查paxdiablos的答案了吗?内循环中的条件也是错误的。此外,argv
数组中的第一个字符串是用于启动程序的命令(特定于平台,但通常包括可执行文件所在的路径)。
再次感谢,你们俩都帮了大忙 :)【参考方案3】:
首先,您需要计算每个参数的字符数。所以循环将一直持续到 -
a < argc
对于每个参数,您需要计算字符数。所以你需要计算字符直到null value
。所以循环将一直持续到 -
argv[a][x] != '\0'
现在您可以只打印每个参数的字符数 :)
更改这部分:
for (int a = 0; a < argc; a++) //counts until a = number of arguments
^^^
int x;
for (x = 0; argv[a][x] != '\0' ; x++) //counts until argv[a][x] == '\0'
^^^
;
cout << "Number of characters in argument " << argv[a] << " = " << x <<"\n"; //Outputs the argument and string length x
这里更改的部分由^^^
表示
【讨论】:
以上是关于我必须编写一个基本上在 c++ 中执行 strlen() 函数的代码,我哪里出错了?的主要内容,如果未能解决你的问题,请参考以下文章
程序在 C++ Tutor 中执行时有效,但在其他任何地方都无效
使用 cmake 时如何在 C++ 中使用库(*.a 文件)