将字符串中的值分配给变量数组

Posted

技术标签:

【中文标题】将字符串中的值分配给变量数组【英文标题】:assinging values in a string to an array or variables 【发布时间】:2021-06-05 07:04:53 【问题描述】:

我有一个字符串:

std::string values= "1 2 3 4 5";

我有变量:

int v1;
int v2;
int v3;
int v4;
int v5;

如何将值字符串中的数字 1、2、3、4、5 分配给变量 v1、v2、v3、v4、v5?

【问题讨论】:

不要这样做;而是按空格分割您的输入并将文本编号存储在一个集合中,例如一个列表。 我的函数接受一个字符串作为参数,字符串的格式是“1 2 3 4 5”;我必须将字符串中的数字分配给 int 变量 v1、v2、v3、v4、v5。如何将此格式字符串的内容添加到变量中? 记住在values 中,'1''1' 的ASCII 数字,其值为49 而不是1,参见ASCII Table and Description。 恐怕还是找不到解决办法。 @MehmetB。你得到的答案有帮助吗?如果有,请考虑accepting吧。 【参考方案1】:

您可以使用std::basic_string 成员函数对您的values 字符串进行操作,以隔离每个数字的开头数字并使用std::basic_string::substr 获取您传递给@987654323 的数字子字符串@ 将数字字符串转换为数值。

通过将各个转换后的值保存到各个变量而不是将每个转换后的值添加到诸如std::vector 之类的容器中,您会使事情变得更加困难。您可以手动执行此操作,它只需要您保留一个计数器,该计数器将分配给下一个变量,然后逻辑将计数器值协调到代码块,将转换后的值分配给该变量。 switch (counter) ... 和其他任何东西一样有意义。

要处理字符串,您可以使用成员函数std::basic_string::find_first_not_of(将空格跳过到数字的开头数字,然后使用std::basic_string::find_first_of 查找数字之后的下一个空格——定义开始以及要转换的数字子串的结束位置。

还有很多其他方法可以解决这个问题,但是将上面概述的内容放在一起,您可以这样做:

#include <iostream>
#include <string>

int main (void) 
    
    std::string values "1 2 3 4 5";
    int v1, v2, v3, v4, v5;
    constexpr int nvars = 5;            /* number of variables */
    size_t n = 0, pos = 0;              /* var counter & pos in string */
    
    /* loop while n less than nvars find start of digit in string */
    while (n < nvars &&
          (pos = values.find_first_not_of (" \t\n", pos)) != std::string::npos)
    
        /* find end position after sequential digits */
        size_t endpos = values.find_first_of (" \t\n", pos);
        /* use stoi (substr (pos, length)) to convert to number */
        int value = std::stoi (values.substr (pos, endpos - pos));
        switch (n)     /* var counter coordinates assignment to var */
            case 0: v1 = value; n++; break;
            case 1: v2 = value; n++; break;
            case 2: v3 = value; n++; break;
            case 3: v4 = value; n++; break;
            case 4: v5 = value; n++; break;
            default: std::cerr << "count error: we shouldn't be here.\n";
                return 1;
        
        pos = endpos;   /* update next start position to current end */
    
    /* output results */
    std::cout << "v1: " << v1 << "\nv2: " << v2 << "\nv3: " << v3 <<
                "\nv4: " << v4 << "\nv5: " << v5 << '\n';

注意:您可以使用try ... catch ... 块来捕获由std::stoi 转换引发的任何异常- 留给您)

使用/输出示例

运行程序会用您的values 字符串中的数字填充v1v5

$ ./bin/stringtovars
v1: 1
v2: 2
v3: 3
v4: 4
v5: 5

查看一下,如果您还有其他问题,请告诉我。

【讨论】:

【参考方案2】:

下面是使用Java实现上述查询的代码sn-p:

import java.util.*;

公共类测试

public static void main(String[] args) 
    

    String var = "1,2,3,4,5";
    List<String> newList = Arrays.asList(var.split(","));
    int v1 = Integer.parseInt(newList.get(0));
    int v2 = Integer.parseInt(newList.get(1));
    int v3 = Integer.parseInt(newList.get(2));
    int v4 = Integer.parseInt(newList.get(3));
    int v5 = Integer.parseInt(newList.get(4));
    System.out.println("v1: " + v1 + "\nv2: " + v2 + "\nv3: " + v3 + "\nv4: " + v4 + "\nv5: " + v5);

【讨论】:

我不赞成,因为虽然您的回答可能对 Java 有所帮助,但 OP 使用的是 C++。两者之间的语法非常不同。 很抱歉我没有说它是 C++ 并且作为一种格式,我必须使用空格而不是逗号。 问题是在 C++ 中,而不是在 java 中

以上是关于将字符串中的值分配给变量数组的主要内容,如果未能解决你的问题,请参考以下文章

C语言 怎么把字符数组中的字符赋值给字符变量

“字符串?”类型的值不能分配给“字符串”类型的变量颤动

将从@escaping接收的值分配给swift中另一个类中的实例变量

将标准输入中的字符串分配给类成员变量

将字符串变量分配给unsigned char变量

将二维指针数组中的字符串分配给一维指针数组