【发布时间】:2020-03-18 05:46:39
【问题描述】:
目标是通过提取由空格分隔的单词,从输入的字符串中创建子字符串。
子字符串本身必须是变量。
听起来很简单,但难点在于您只能使用 strcpy、strcmp、strlen、strcat、strncpy、strncmp、strnlen 和 strncat。
例子:
输入:
"John 40 Hitman"
司机:
...
cout << word1 << endl
<< word2 << endl
<< word3 << endl;
输出:
John
40
Hitman
这是我的代码
#include <iostream>
#include <cstring>
#include <stdio.h>
int main(){
const char *string = "Name Age Job";
char name[10];
char age[10];
char job[10];
int length = strlen(string);
int temp = 0;
bool flag = false;
for(int i = 0; i < length + 1; i++){
if(isspace(string[i]) && !flag){
strncpy(name, string, i);
name[i] = '\0';
temp = i;
flag = !flag;
cout << name << endl;
continue;
}
if(isspace(string[i])){
strncpy(age, string + temp + 1, length - i - 1);
age[temp - i] = '\0';
temp = i;
cout << age << endl;
continue;
}
if(string[i] == '\0'){
strncpy(job, string + temp + 1, length);
job[temp - i] = '\0';
cout << job << endl;
}
}
它可以工作,但它必须使用标志布尔值,字符串不是动态的,只适用于有 2 个空格的字符串,并且有很多重复的代码。总的来说真的很笨拙,但我花了大约两个小时,我不知道如何改进它。
如果您想知道,这确实是一个家庭作业问题,但它是一个入门课程,我的教授只想要一个只有 3 个单词的硬编码字符串的正确输出。但是,我想学习如何改进它,并且非常感谢任何帮助。谢谢。
【问题讨论】:
-
如果仅使用 C 风格的 str 函数是真的要求,那么您的类是 C 编程类而不是 C++ 类。对不起,但这就是现实。通过将 char[] 更改为 std::string 来对其进行 C++ 化。
-
@acraig5075 这是一个很好的实践,可以真正理解字符串是如何工作的。 C++ 程序员必须知道这一点,即使他们只使用 std::string。
-
关于代码审查 - 是的,这是获得有关完整工作代码的一般反馈的最佳站点。不过,只要代码足够本地化,这并不是题外话。
-
我投票结束这个问题,因为它是代码审查请求。
标签: c++ string substring c-strings