在没有指针的情况下复制 C 字符串中的单个字符

Posted

技术标签:

【中文标题】在没有指针的情况下复制 C 字符串中的单个字符【英文标题】:Copy single characters in C-string without pointers 【发布时间】:2015-09-02 02:34:08 【问题描述】:

这是作业:

创建一个包含姓名、年龄和头衔的 Cstring 变量。每个字段 由一个空格隔开。例如,字符串可能包含“Bob 45 程序员”或任何其他相同格式的姓名/年龄/头衔。仅使用编写程序 cstring (不是类 string )中可以提取名称的函数, 年龄和标题到单独的变量中。

我从字符串中提取了名称,但之后我无法获取任何字符。我不能使用指针,因为我们还没有学会,所以没有 strtok。我只需要一个方向,因为我确信有一个功能可以让这更容易。谢谢。

#include <iostream>
#include <cstring>

using namespace std;

int main()

    char y[] = "taylor 32 dentist";
    char name[25];
    char age[4];
    char title[40];
    int i = 0;
    while (y[i] != ' ')
    
        while (y[i] != '\0')
        
            if (y[i] == ' ' || y[i + 1] == '\0')
            
                break;
            
            name[i] = y[i];
            i++;
        
    
    cout << "Name: " << name << endl
         << "Age: " << age << endl
         << "Title: " << title << endl;
    return 0;

已解决:

#include <iostream>
#include <cstring>

using namespace std;

void separate_Variables(char y[], char name[], char age[], char title[]);

void output(char name[], char age[], char title[]);

int main()

    char y[] = "taylor 32 dentist";
    char name[25];
    char age[4];
    char title[40];
    separate_Variables(y, name, age, title);
    output(name, age, title);
    return 0;


void separate_Variables(char y[], char name[], char age[], char title[])

    int i = 0;
    int j = 0;
    while (y[i] != '\0' && y[i] != ' ') 
        name[j++] = y[i++];
    
    name[j] = '\0';
    j = 0;
    i++;
    while (y[i] != '\0' && y[i] != ' ') 
        age[j++] = y[i++];
    
    age[j] = '\0';
    j = 0;
    i++;
    while (y[i] != '\0' && y[i] != ' ') 
        title[j++] = y[i++];
    
    title[j] = '\0';
    j = 0;


void output(char name[], char age[], char title[])

    cout << "Name: " << name << endl
         << "Age: " << age << endl
         << "Title: " << title << endl;

【问题讨论】:

通过y 创建一个迭代器(你可以称它为yi 或其他名称),然后创建单独的循环来提取每个单词。每次,您都会重置 i,但不会重置 yi。通常你会把它包装在一个函数中,但我不得不假设你还没有“学习”函数。此外,无论如何,您都希望将指针用作函数参数.... 好吧,酷,我明白你的意思,为整个字符串设置一个计数器,并为单词设置一个子计数器。我们学过函数,我只是想在 main 中弄清楚,一旦发现问题就将其分开。 或许值得关注std::strcspn。 为什么问题中提出了解决方案? @Martin 我更新了它以帮助任何需要它的人。 【参考方案1】:

您不需要嵌套循环 - 您只需要一个接一个的三个循环。

循环看起来相同:获取i-th 字符,将其与空格进行比较,然后存储在三个目的地之一。当您看到空格时,将其替换为'\0',然后前往下一个目的地:

int j = 0;
while (y[i] != '\0' && y[i] != ' ') 
    name[j++] = y[i++];

name[j] = '\0'; // Add null terminator
j = 0;          // Reset j for the next destination
i++;            // Move to the next character in y[]
... // Do the same thing for age and title

【讨论】:

所以我使用该格式并为字符串创建了一个主计数器和一个用于复制字符的子计数器,但在第一个循环之后它没有复制任何内容。它得到名字,但年龄和头衔是空白的。另外,你能解释一下为什么我们使用空终止符吗? @urallsad 我错过了循环后的i++ 部分(demo)。【参考方案2】:

外部循环需要测试'\0'

可以为每个字段复制内部循环(现在为 != ' ')。您需要一个单独的索引变量来分隔 i 和 y 以及将它放在哪里作为字段(fi?)

【讨论】:

以上是关于在没有指针的情况下复制 C 字符串中的单个字符的主要内容,如果未能解决你的问题,请参考以下文章

如何在不复制数组的情况下返回 Javascript 中的数组减去单个项目? [复制]

如何反转字符串数组并使用指针反转每个字符串?

任何可用于 C 中无符号字符指针行为的文档? [复制]

中缀到前缀的程序中的c函数中未返回反转字符串

在C中为结构中的单个字符分配内存[重复]

如何在没有中间副本的情况下在标准 C 中实现 memmove?