我的帖子分为三个部分:

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


我的问题:


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

最佳答案

sizeof()不返回以null终止的字符串数组的长度。相反,您需要类似strlen()的内容。

10-08 00:04