c/c++语言开发共享如何初始化只包含空格的字符串而根本没有垃圾?

我在代码中的目标是初始化具有80个字符的字符串,并且仅当用户键入不是''' ''t''n'字符时。 打印“非法命令”。

现在,如果用户键入例如3个字符的空格并按Enter键。 输出为(80-4)= 76次“非法命令”。 并且它根本不需要打印它,因为用户输入的所有字符都是''' ''t''n'

那个案子请帮帮我。

代码 :

 void main() { int i; char str[80]=""; gets_s(str, sizeof(str)); for (i = 0; i < 80; i++) { if ((str[i] != 'n' && str[i] != '' && str[i] != 't' && str[i] != ' ')) { printf_s("illegal character: %cn", str[i]); } } } 

如何初始化只包含空格的字符串而根本没有垃圾?

    我在代码中的目标是初始化具有80个字符的字符串,并且仅当用户键入不是 0,, t, n的字符时。 打印“非法com

    看来,如果用户只输入''' ''t''n' ,则不会打印任何消息。

    char str[80]=""; 指定初始化整个数组,但可能不是OP的问题。

    然而,脚注1和评论可以解释OP的意外输出


    这种挑战的原因是用户输入可能包含空字符 ,而不仅仅是附加的字符

    使用getchar()将是一种直接的方法。

     int ch; while ((ch = getchar()) != 'n' && ch != EOF) { if (ch != ' ' && ch != 't' && ch != '') { printf_s("illegal character code: %dn", ch); } } 

    gets_s(); 用于任务比较棘手,因为它不返回读取的长度,输入可能包含嵌入的空字符

    要检测嵌入的空字符 ,缓冲区不会以'n'结尾,并且希望(尽管未指定.1 )未使用的部分保持不变。 因此,通过预填充'n'代码可以区分附加的空字符和读取的字符

     int main(void) { int i; char str[80]; memset(str, 'n', sizeof str); if (gets_s(str, sizeof str)) { int length = sizeof str; while (length > 0) { length--; if (str[length] == '') break; // found appended null character } for (int i=0; i 

    我更喜欢getchar()方法。


    1附加的空字符后缓冲区的值未指定为未更改 - 但这是常见情况。 嗯,但是如果它改变了,那就解释了OP的问题。 所以避免gets_s();另一个原因gets_s(); 这里。

    当你说

     char str[80] = ""; 

    看起来你实际上没有初始化所有80个字符。 您明确地将第一个字符初始化为'' ,但看起来您的编译器使用随机值将其他79保留。 (稍后会详细介绍这一点。)

    当你说

     for (i = 0; i < 80; i++) 

    你要求循环遍历数组中的所有80个字符 - 但这没有意义。 gets_s函数只填充一些字符 - 与用户键入的字符一样多,加上一个尾随'' 。 如果用户键入的字符数少于79个,则str中的许多字符仍未触及(并且可能仍然是随机的)。

    尝试将循环更改为

     for (i = 0; str[i] != ''; i++) 

    或者如果你想保持安全

     for (i = 0; i < 80 && str[i] != ''; i++) 

    因为您的程序使用未初始化的内存,所以它在不同系统上的行为可能会有所不同。 当我在我的计算机上运行程序时,显然所有79都是0 ,这意味着我没有看到任何额外的错误消息。 (所以起初我无法理解你在说什么。)但是听起来,在你的系统中,它们实际上具有随机的非零值。 如果您将错误消息更改为,则可以看到此消息

     printf("illegal character: 0x%02xn", str[i]); 

    这将打印您看到的所有“非法”字符的(hex)表示。 我猜他们会或多或少随机数。

    (正如chux在评论中指出的那样,你的编译器应该将其他79个字符初始化为0,所以听起来你的编译器可能是旧版本,并且在这方面也有错误。)

    您可以尝试的另外两件事是:

    但这些变化都不是特别好的主意。 如果用户键入6个字符,您确实只想检查他明确键入的6个字符,而不是最初分配的所有80个字符。

      以上就是c/c++开发分享如何初始化只包含空格的字符串而根本没有垃圾?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/562140.html

      (0)
      上一篇 2021年2月4日
      下一篇 2021年2月4日

      精彩推荐