做一个由我定的数组,字符串。

102 阅读4分钟

问题

来源

在很多时候,在很多问题中,我总能遇到很多问题要求我输入多少多少数或者字母,但内存却根据我输入多少来决定,这让我很困扰所以我决定深入解决一下。

思考过程

问题异点和解决方式

平常建立一个数组首先要的是数组名然后是数组大小。 int a[x]; 但这样明显不太行,x必须是是确定的数字。 要求是要我决定大小随时可以用随时可以改。那么将分为两种情况解决问题。

  1. 输入一串数据得知有多少容量 这个问题的解决方法是在输入之后再一次将所有内容依次导入到有一个空的容器中,并对每一次导入计数,就可以得到输入了多少项内容。如下;
#include <iostream>  
#include <string>  
  
using namespace std;  
  
int main() {  
    string s;  
    int a=0;  
    getline(cin,s);  
    for(char c:s){  
        if(c!=' '&&c!='\n'){  
        a++    ;          
        }  
    }  
    cout<<a<<endl;  
    return 0;  
}
  • 其中getlin(cin,s);
  • getline(cin, s)的作用是从标准输入(通常是键盘输入)读取一行文本,并将其存储到字符串变量s中。

它会读取直到遇到换行符为止,但不包括换行符。例如,如果用户输入 “Hello World” 并按下回车键,getline(cin, s)会将 “Hello World” 存储到s中。

它与使用>>运算符读取输入的区别在于,>>在遇到空白字符(如空格、制表符、换行符)时会停止读取,而getline会读取一整行,包括其中的空白字符,直到遇到换行符。

  • 借此我们可以将输入的字符全部存储进“s”中,然后再用for循环进行导入内容于空白的“c”中,并逐一记录数量,从而达到得知内存大小的结果。

屏幕截图 2024-10-27 205042.png 这个例子就是输入了jbsak这五个字符并算出有五个字符。

屏幕截图 2024-10-27 205207.png 同样如果中间输入空格也是可以算出字符数的,这就要归功于getline输入了。

  1. 容器大小和内容都由我定义 这个问题的难点在于:一般情况下建立一个数组要先确定数组大小并且输入数组内容,但我希望这些我可以在键盘上输入。所以有以下代码。
#include <iostream>  
using namespace std;  
  
void printArray(int arr[], int n)  
{  
    for (int i = 0; i < n; i++)  
    {  
        cout << arr[i] << " ";  
    }  
    cout << endl;  
}  
  
void inputArray(int *p, int n)  
{  
    for (int i = 0; i < n; i++)  
    {  
        cin >> *(p + i);  
    }  
}  
  
int main()  
{  
    int w[100], k;  
    cin >> k;  
    inputArray(w, k);  
    printArray(w, k);  
    return 0;  
}

我们在这里建立了两个函数,先定义一个内存无限大(或者足够大的)数组,对于printArray函数的作用是确定数组内存,inpuytArray函数的作用是输入数组内容。

  • printArray原理是通过循环来限制输入的个数。
  • inpuytArray原理是通过循环对数组地址进行输入。
  • 当对指针进行算术运算时,指针所指向的类型的大小决定了偏移量的单位。例如,如果有一个指向整数的指针 int* ptr,假设整数大小为 4 字节,那么 ptr + 1 将使指针指向距离当前位置 4 个字节的内存地址,这里的 “1” 实际上代表了一个偏移量,其值为一个整数类型的大小(4 字节)。在某些情况下,可以通过指针和偏移量来访问结构体或类的特定成员。例如,已知结构体的内存布局和某个成员在结构体中的偏移量,可以通过将指向结构体的指针加上该偏移量来直接访问那个成员。这在一些底层编程或性能优化场景中可能会用到。
  • 对于此代码可以用直接访问数组地址并使用偏移量对其内容进行输入。数组的第0项地址就是*w第1项就是*(w+1)以此类推。

屏幕截图 2024-10-27 204833.png

  • 运行的例子是这样的,先输入想要的内存大小,再输入数组内容,最后就可以输出一大串数字了。