我必须编写一个基本上在 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 &lt; 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 文件)

关于 getline(cin, string) 的 C++ 快速问题

在 2D 向量上执行单行算术以找到简化的行形式 C++

c++ 在运行时修改资源

编写一个c++工程