Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将无法识别的字符添加到输出中_C_Printf_Character_Clion - Fatal编程技术网

C 将无法识别的字符添加到输出中

C 将无法识别的字符添加到输出中,c,printf,character,clion,C,Printf,Character,Clion,我在上编程,在程序的输出中收到一些无法识别的字符,这些字符涉及使用getchar()函数和字符串。该程序的目标是复制输入,替换一个或多个空格(即),这些空格与一个空格放在一起,然后打印输出。输出字符串包含一些无法识别的字符,形式为菱形方框问号,我不明白为什么。下面是我的代码和两个示例输入输出对供参考: 我的代码: #include <stdio.h> int main() { int c, i = 0; char s[100], g; // i am restrictin

我在上编程,在程序的输出中收到一些无法识别的字符,这些字符涉及使用
getchar()
函数和字符串。该程序的目标是复制输入,替换一个或多个空格(即
),这些空格与一个空格放在一起,然后打印输出。输出字符串包含一些无法识别的字符,形式为菱形方框问号,我不明白为什么。下面是我的代码和两个示例输入输出对供参考:

我的代码:

#include <stdio.h>

int main() {

  int c, i = 0;
  char s[100], g; // i am restricting the length of the string to 100

  while ((c = getchar()) != EOF) {
      if (i == 0)
      {
          i++;
          g = (char) c;
          s[0] = (char) c;
          continue;
      }
      if ((c == ' ' ) && (g == ' ')) 
      {
          continue;
      }

      s[i] = (char) c;
      g = (char) c;
      i++;
  }
  printf("%s\n", s);
  return 0;
}
产出1:

投入2:

产出2:

输入中的
^D
表示我使用了
Ctrl+D
,以便
getchar()
读取EOF
正如预期的那样,在返回输出时,输入中多余的空格已被删除,但这些无法识别的字符也会被打印出来,这让我感到困惑
在这些无法识别的字符中,字符的数量似乎在变化,最后一个字符(紧随菱形方框问号之后的字符)是可识别的字符,但也是不必要的。

关于这一点,我有几个问题:

  • 为什么会这样?这可能与我设置为100的字符串长度有关吗
  • 这是与IDE有关还是与我的 算法
  • 值的复制是如何进行的?字符串添加功能中是否存在其他字符
  • 这个问题是否可以在另一个人的帮助下得到纠正 方法还是功能

  • 谢谢,如果您有任何帮助,我们将不胜感激。

    正如@kaylum所指出的,您必须在打印字符串之前终止字符串。作为良好的实践,您可能还希望为变量指定有意义的名称。此外,如果
    其他
    同样有效,则不需要使用
    继续
    。此外,由于字符串的长度有限,因此最好进行边界检查。也许你想要这样的东西:

    int main()
    {
        int chr, idx = 0;
        char str[100], last_chr = '\0';
        
        while ((chr = getchar()) != EOF  &&  idx < 99) {
            if (last_chr != ' '  ||  chr != ' ')
                last_chr = str[idx++] = chr;
        }
        str[idx] = '\0';
        printf("%s\n", s);
        return 0;
    }
    
    intmain()
    {
    int-chr,idx=0;
    char str[100],last_chr='\0';
    while((chr=getchar())!=EOF&&idx<99){
    如果(最后一个字母)
    last_chr=str[idx++]=chr;
    }
    str[idx]='\0';
    printf(“%s\n”,s);
    返回0;
    }
    
    请注意,将
    last_chr
    (旧的
    g
    )初始化为非空格值,无需在循环中进行另一次测试


    顺便说一句,菱形问号字符是当字符不在系统字体中时打印的图形。

    C中的字符串需要以NUL结尾。添加
    s[i]='\0'
    printf
    之前。您确定应该使用
    Ctrl+D
    ?参考@kaylum谢谢,我这样做了,但无论输入的长度如何,输出中仍然有一个无法识别的字符。当字符串以NULL结尾时,我的问题中提到的其他已识别字符也被删除。@PalLaden
    Ctrl+D
    似乎是唯一响应我输入的密钥对,是的,只要在该点结束输入,它就可以很好地工作。在您提供的链接中,对这些问题的回答是,对于基于unix的系统是
    Ctrl+D
    ,对于Windows系统是
    Ctrl+Z
    。我使用Windows系统,
    Ctrl+Z
    什么也不做。也许这和IDE有关?谢谢,这已经很好地解释了,它解决了我的问题,我理解了。我想我犯了一个错误,在尝试了@kaylum之前的评论之后,我将I增加了1(使用
    I++
    ),然后使用
    str[idx]='\0'
    。另外,感谢您解释钻石问号字符。
    Hello, This is me. Welcome
    Hi Hello hello
    Just Kidding This is me
    ��������������������������������������B
    
    123 456   789 abc
    \n \t 123 145 *&$&)$@
    1234567805018308513
    ^D
    
    123 456 789 abc
    \n \t 123 145 *&$&)$@
    1234567805018308513
    ����������������������������������������������:
    
    int main()
    {
        int chr, idx = 0;
        char str[100], last_chr = '\0';
        
        while ((chr = getchar()) != EOF  &&  idx < 99) {
            if (last_chr != ' '  ||  chr != ' ')
                last_chr = str[idx++] = chr;
        }
        str[idx] = '\0';
        printf("%s\n", s);
        return 0;
    }