我目前在更改字符串的内容时遇到一些问题。
我正在编写的以下程序在字符串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”
答案 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';
}