c++ - 关于命令行参数/char* 的三个问题

标签 c++ c++11

我的帖子分为三个部分:

1. My code
2. Example input and output
3. My three questions

我的代码:

#include <iostream>
#include <cstdlib>
#include <cmath>
#include <iomanip>
#include <fstream>
#include <sstream>
#include <string>
#include <cstring>

using namespace std;

void deleteTrash(char*, char*);

const int kStr = 2;
const int kStrLen = 3;

int main(int argc, char* argv[])
{
    if (argc < 4) {
        cout << "Incorrect argument given." << endl;
        cout << "Try again." << endl;
        return 0;
    }

    cout << "PRINT argv[2]" << endl;
    cout << "-----" << endl;
    for (int i = 0; i < sizeof(argv[2]); i++) {
       cout << "Iterator: " << i << endl;
       cout << argv[2][i] << endl;
    }

    char* inputString;
    deleteTrash(argv[kStr], inputString);

    cout << "PRINT inputString" << endl;
    cout << "-----" << endl;
    for (int i = 0; i < sizeof(inputString); i++) {
        cout << i << endl;
        cout << inputString[i] << endl;
    }

    int strLen;
    stringstream num;
    num << argv[kStrLen];
    num >> strLen;

    if ( num.fail() ) {
        cout << "Incorrect argument given." << endl;
        cout << "Try again." << endl;
        return 0;
    }

    if ( strLen < sizeof(inputString) ) {
        cout << "Incorrect argument given." << endl;
        cout << "Try again." << endl;
        return 0;
    }

    return 0;
}

void deleteTrash(char* tempString, char* inputString) 
{
    int tempStringLen = sizeof(tempString);
    int newSize = 0;

    while (tempString[newSize] != '\0')
        newSize++;

    char newString[newSize + 1];

    int iterator = 0;

    while (tempString[iterator] != '\0') {
        newString[iterator] = tempString[iterator];
        iterator++;
    }

    newString[newSize] = '\0';

    cout << "PRINT newString" << endl;
    cout << "-----" << endl;
    for (int i = 0; i < sizeof(newString); i++) {
        cout << newString[i] << endl;
    }   

    inputString = newString;

    cout << "PRINT inputString" << endl;
    cout << "-----" << endl;
    for (int i = 0; i < sizeof(inputString); i++) {
        cout << "Iterator: " << i << endl;
        cout << inputString[i] << endl;
    }   

    return;
}

示例输入:

./hw1q5 4 W# 3

输出:

PRINT argv[2]
-----
Iterator: 0
W
Iterator: 1
#
Iterator: 2

Iterator: 3
3
Iterator: 4

Iterator: 5
T
Iterator: 6
E
Iterator: 7
R
PRINT newString
-----
W
#

PRINT inputString
-----
Iterator: 0
W
Iterator: 1
#
Iterator: 2

Iterator: 3

Iterator: 4

Iterator: 5

Iterator: 6

Iterator: 7

PRINT inputString
-----
0
Segmentation fault: 11

我的问题:

  1. 为什么 argv 包含 3 个以上的元素(M、# 和\0)。它打印出 8 个元素(打印语句迭代 0 - 7),这些元素在 W、#、\0 之后是垃圾。它不应该只打印 3 个元素(M、# 和\0)吗?为什么会这样?我该如何解决?
  2. 为什么当我将 newString(char 类型)设置为 inputString(char* 类型)时,通过执行 inputString = newString,inputString 在 print 语句中迭代 8 次,在打印 M、# 和\0 之后打印空白。
  3. 为什么第三条语句会出现seg fault?

最佳答案

sizeof() 不返回空终止字符数组字符串的长度。相反,您需要类似 strlen() 的东西。

关于c++ - 关于命令行参数/char* 的三个问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23645691/

相关文章:

c++ - 用户定义的文字是在编译时还是运行时解析的?

c++ - "Double"函数与 C++0x

C 数组和结构中的 C++ 统一初始化

c++ - 谁能解释这个程序的类型提升以及为什么输出相同

c++ - 将 malloc 更改为新的会导致错误

c++ - 堆栈和堆上的 STL 容器

c++ - 将 "policy"附加到函数参数

c++ - 像 C::C(const C&&) 这样的构造函数我们怎么调用它?除了禁止从 const 移动外,还有其他用途吗?

c++ - 简单程序中奇怪的引用传递问题

c++ - 从命名管道读入时,char 数组会自动附加一个空终止符吗?