无法更改C中字符串的最后一个索引的内容?

时间:2019-03-29 06:08:06

标签: c string character

我目前在更改字符串的内容时遇到一些问题。

我正在编写的以下程序在字符串src中重新排列以辅音开头的单词,以使辅音最后出现在后面(bob-> obb)。以元音开头的单词保持不变。结果将插入到字符串dest中。

但是,句子输入的最后一个单词总是以结尾的辅音结尾(bob-> ob)。这向我表明,我无法更改字符串dest的最后一个索引的内容。

有原因吗?

void convert(char src[], char dest[]) {
    int i, isVowel, first_pos;
    int len = strlen(src);
    int count = 0;
    char first = 0;

    for (i = 0; i < len; i++) {
        while (!isspace(src[i])) {

            if (first == 0) {
                first = src[i];
                first_pos = i;
            }

            isVowel = first == 'a' || first == 'e' || first == 'i' || first == 'o' || first == 'u';

            if (isVowel == 1) {
                dest[count++] = src[i];
            }   
            else if (i != first_pos) {
                dest[count++] = src[i];
            }   

            i++;
        }   

        if (isVowel == 0) {
            dest[count++] = first;
        }   

        dest[count++] = ' ';
        first = 0;
      }
}

输入:“嗨,伙计们” 预期输出:“ ih uysg” 实际输出:“ ih uys”

2 个答案:

答案 0 :(得分:2)

您应该更改

queue of tasks

while (!isspace(src[i])) {

函数终于添加

while (src[i] && !isspace(src[i])) {

修改后的代码:

dest[count++] = '\0';

答案 1 :(得分:0)

据我了解,您想迭代一串字。如果单词以辅音字母开头,则需要将该辅音移至单词结尾(同时保持其余单词不变)。如果单词以元音开头,则您希望整个单词保持不变。

在您的代码中,我看到了一些看起来很奇怪的东西:

  • 如果输入以空格开头,则可以使用isVowel未初始化,这是未定义的行为

  • 看来您永远不会零终止目标字符串

那是说我认为您的算法太复杂了。要获得更简单的实现,请考虑以下算法:

While unhandled characters in src:
  if current char is space 
      copy space to dest
  else
      if current char is consonant
          save current char and move to next input char
      copy rest of word to dest
      if first char was consonant
          add saved char to destination

代码如下:

void convert(char src[], char dest[]) 
{
  int i = 0;
  int count = 0;

  while(src[i]) 
  {
    if (isspace(src[i]))
    {
      // Copy the space
      dest[count++] = src[i++];
    }
    else
    {
      int isVowel = src[i] == 'a' || src[i] == 'e' || src[i] == 'i' || src[i] == 'o' || src[i] == 'u';

      char first;
      if (!isVowel)
      {
        // Save first char and move to next char
        first = src[i];
        ++i;
      }

      // Copy rest of word
      while (src[i] && !isspace(src[i]))
      {
        dest[count++] = src[i++];
      };

      if (!isVowel)
      {
        // Add the saved char
        dest[count++] = first;
      }
    }
  }

  // Terminate destination string
  dest[count] = '\0';
}