c++ - 我必须编写一个基本上在 C++ 中执行 strlen() 函数的代码,我哪里出错了?

标签 c++

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;
}

最佳答案

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

关于c++ - 我必须编写一个基本上在 C++ 中执行 strlen() 函数的代码,我哪里出错了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29204230/

相关文章:

c++ - 为什么我不能将对象插入到 C++ 的映射中

c++ - 继承和默认构造函数

c++ - MinGW 中的 uint24_t 和 uint48_t

c++ - 如何将一个类的成员函数用作另一个类的友元函数?

c++ - 使用调试版本在 C API 上调用 delete 到 C++ 接口(interface)段错误

c++ - 如何在 makefile 中的编译器之间切换?

c++ - Qt 多线程通信

c++ - 当引用指向父类的指针时,对象会丢失其成员的数据

c++ - std::wstring 中的错误?

c++ - 加载 vector 到 SSE 寄存器