【问题标题】:Getting error `\365\277\357\376 in the terminal [closed]在终端中出现错误 `\365\277\357\376 [关闭]
【发布时间】:2019-08-26 18:12:27
【问题描述】:

任务是从字符串中每隔一个单词输出一次

我做了一个循环来检查字符串中的每个字符,当它到达一个空格时,布尔值会将它的值更改为相反的值,所以在它到达下一个空格之前,它会将字符从第一个字符串复制到第二个

int main(void)
{
char str1[max]="Hellow my name is Tom why not today";
  char str2[max];
    int i;
    bool a=false;
    for (i=0;i<strlen(str1);i++)
    {
        if ((int)str1[i]==32)
        {
            a=!a;
        }
        if (a==true)
        {
            str2[i]=str1[i];
        }
    }
    printf ("%s\n",str2);
    return 0;

}

终端显示:`\365\277\357\376 my\365\277\357\376 isu

【问题讨论】:

  • 您不会初始化所有目标数组str2,也不会将其作为字符串终止。
  • 这段代码有很多问题。它不初始化目标,它为str1 中的每个字符调用strlen,导致 O(n**2) 时间复杂度,它不会终止目标字符串,并且它使用不自然的构造,如if (a == true) 而不仅仅是 if (a)。错误的代码。
  • 您不必指定初始化数组的大小。 char a[] = "aaa" 是完全正确的。您也可以使用 ' ' 字符常量而不是 32
  • 由于 ' '32 是 int,因此您不需要转换 (int) 进行比较
  • @TomKarzes 为 (i=0;str1[i]!='\0';i++) 更改此循环是否更好?另外,请您解释一下如何终止目标字符串。

标签: c string output


【解决方案1】:

str1 和 str2 需要不同的索引。当 'a' 为假时,您不会为 i 的值写入 str2[i]。这将导致您不写入的字节中的随机数据。这就是为什么您会在每 2 个单词之间看到垃圾数据。

int dest_index = 0;
for (i=0;i<strlen(str1);i++)
{
    if ((int)str1[i]==32)
    {
        a=!a;
    }
    if (a==true)
    {
        str2[dest_index++]=str1[i];
    }
}
str2[dest_index] = 0;  // Null terminate the destination string
printf ("%s\n",str2);

【讨论】:

  • 我知道了,谢谢!
  • 这个答案保留了原始代码存在的几个问题,特别是在循环的每次迭代中对strlen 的调用。不,您不能假设编译器会为您将其移出循环。也许,在高优化水平下,但在许多情况下,即使它想这样做也做不到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 2021-11-27
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2012-10-19
相关资源
最近更新 更多