如果找到空格,请在字符数组中插入一个单词

时间:2020-04-25 09:37:15

标签: c++

我正在尝试使用strcat在一个有空格(ASCII代码= 32,更清楚的字符)的地方插入一个单词。

在C中有空格的地方可以插入单词吗?

let guild = client.guilds.get(serverID); //only works if bot is in the server with serverID as well
let user = guild.members.get(userID);
if (user) console.log("Tada, he is there");

在我看来,这应该有效,但实际上无效。我得到E0167类型的参数“ char”与类型“ char *”的参数不兼容。

我可以使用strcat进行此操作,还是有其他方法? 谢谢。

2 个答案:

答案 0 :(得分:1)

因此,让我们首先分析您的程序。结果如下:

  • 您正在使用C ++和C的混合体。您应该选择一种语言。您用C ++标记了问题
  • 缺少包含文件
  • 我认为您仍然在使用C。但是不幸的是,这还包含错误
  • using namespace std;应该避免。您可以在此处阅读许多关于原因的帖子
  • char a[100];这样的普通C样式数组不应在C ++中使用。它们很容易出错
  • 对于字符串,您应该在C ++中使用std::string
  • 在for循环中,您正在混合带符号和无符号值。 std::strlen返回无符号类型std::size_t
  • strcat不应使用。我的编译器甚至没有编译它。
  • strcat带有纯C样式数组非常危险,通常会导致不确定的行为
  • 编译器已经告诉您一个问题。 strcat期望将char *作为第一个元素。您正在给它一个char
  • strcat并没有达到您的期望。它总是将第二个参数附加在字符串的 end 处。不在某个位置上
  • 因此,即使您将其更正为strcat(&a[i], "test ");,也不会在字符串的 end 处将“ test”插入位置i。如果您输入的字符串长度为100,且末尾有空格,则总是会导致灾难。
  • 示例中没有一行注释
  • 像“ a”这样的变量名称没有意义。始终使用有意义的变量名
  • 您在for循环中使用i++。始终使用++i
  • 应避免使用诸如“ 100”之类的魔术数字。为什么是100?是不是99、101或555?
  • 功能main已定义为int。它应该返回一个值,例如return 0;

因此,您的代码中存在很多问题

我们有以下类别的问题:

  • 硬语法错误
  • 设计错误
  • 语义错误
  • 样式错误

如何解决?由于我们仍然使用C语言,因此像David这样的专家应该给出答案,但是我会尽力而为。 2个解决方案:

  1. 继续使用C风格
  2. 编写C ++程序

因此,C风格解决方案的众多示例之一

#include <iostream>
#include <cstring>

int main()
{
    // We want to work on a string with the maximum length of 0, including the terminating 0
    constexpr size_t MaxStringSize = 10U;

    // Here we will store the string in a C-Sytle char array
    char myText[MaxStringSize];

    // Now get the string from the user. Limit to a maximum length
    std::cin.get(myText, MaxStringSize);

    // We want to replace a space with the following text
    const char* replaceText = "test ";
    const size_t replaceTextLength = std::strlen(replaceText);

    // Now, iterate over all characters in the string given by the user and replace spaces
    for (size_t i = 0U; i < std::strlen(myText); ++i) {

        // Check, if the current character is a space, because then we need to replace
        if (myText[i] == ' ')
        {
            // We need space for the replacement text. So, we shift all characters at position i to the right
            // Caveats. The string array has a maximum length. We must not shift over the border
            if ((i + replaceTextLength +strlen(&myText[i])) < MaxStringSize) {

                // make free space
                std::memmove(&myText[i]+ replaceTextLength, &myText[i]+1, strlen(&myText[i])+1);

                // Copy replacement text
                std::memmove(&myText[i], replaceText, replaceTextLength);
            }
        }
    }
    // Show result to the user
    std::cout << myText;

    return 0;
}

现在是C ++解决方案。使用C ++标准库。

#include <iostream>
#include <string>
#include <regex>

int main() {

    // Read a string from the user and check, if that operatrion was succesful
    if (std::string line{}; std::getline(std::cin, line)) {

        // Show text with replacements to the user
        std::cout << std::regex_replace(line, std::regex(" "), "test ") << "\n";
    }
    return 0;
}

答案 1 :(得分:0)

Fatal error: Uncaught Twilio\Exceptions\RestException: [HTTP 401] Unable to fetch record: Authentication Error - invalid username in C:\xampp\htdocs\calls\vendor\twilio\sdk\src\Twilio\Version.php:86 Stack trace: #0 C:\xampp\htdocs\calls\vendor\twilio\sdk\src\Twilio\Version.php(111): Twilio\Version->exception(Object(Twilio\Http\Response), 'Unable to fetch...') #1 C:\xampp\htdocs\calls\vendor\twilio\sdk\src\Twilio\Rest\Api\V2010\Account\QueueContext.php(51): Twilio\Version->fetch('GET', '/Accounts/AP726...') #2 C:\xampp\htdocs\calls\agent\incomming.php(22): Twilio\Rest\Api\V2010\Account\QueueContext->fetch() #3 {main} thrown in C:\xampp\htdocs\calls\vendor\twilio\sdk\src\Twilio\Version.php on line 86

注意:最好使用单宽度字符代替宽字符(例如,将“ test”作为char)。如果您想这样做,程序可能会变得更加复杂。如果您考虑将空格字符替换为字符数组中的另一个字符作为字符串,这很简单。我搜索过堆栈溢出,可以将#include <iostream> #include <cstring> // use cstring not string or you'll be unable to use strlen() function using namespace std; const int N = 100; int main(void) { char str[100]; cout << "Input a string: "; cin.get(str, N); for (int i = 0; i < strlen(str); i++) { if (str[i] == ' ') { str[i] = '_'; // change with your favorable char } } for (int j = 0; j < strlen(str); j++) { cout << str[j]; } cout << endl; return 0; } 替换为string,也可以将string替换为char,但不能将char(空格)替换为char数组char