关于C语言的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于C语言的问题相关的知识,希望对你有一定的参考价值。

printf("%d\n",strlen("\t\"\065\xff\n"));
我知道答案是:5.但是不知道为什么,请哪位C语言高手指点一下.谢谢!
那么他们分别占几个字节呢,并且\065,\xff换成十进制的分别又是几呢?

一个控制位站一个字节长度 也就是8位 这样
\t
\"
\n
就已经站用3个字节
\O 代表无符号8进制数 他不站位 后面跟的65 转2进制为110101 不满8位按8位计 也就是站一个字节 转换为10进制为53 这里指的是无符号
\x 代表无符号16进制数 他不站位 后面跟ff 转2进制为11111111 正好8位 站一个字节 转10进制为255 这里指的是无符号
所以一共站5位
参考技术A 实际上就是求字符串 \t\"\065\xff\n 的字符数量,不算最后的\0结束符.

\t是制表符,\"是",\065是一个8进制数,\xff是一个16进制数,\n是换行,虽然他们的转义意义不一样,但是他们按字符算时都是ASCII码的一种表示,所以共占5个字节.
参考技术B 有5个逃逸字元
\t 水平制表符Tab
\" 双引号
\065 以8进制表示的5
\xff 以16进制表示的无名字符。打印出来显示为占两个字符位的空格
\n 换行符

关于c语言循环与布尔运算的问题

#include <stdio.h>
int main(void)

long num;
long sum = 0L;
_Bool input_is_good;
printf("Please enter an integer to be summed ");
printf("(q to quit): ");
input_is_good = (scanf_s("%ld", &num) == 1);
getchar();
while (input_is_good)

sum = sum + num;
printf("Please enter next integer (q to quit): ");
input_is_good = (scanf_s("%ld", &num) == 1);
getchar();

printf("Those integers sum to %ld", sum);
getchar();
return 0;

为什么这个代码不论输入1还是0还是2等整数,都无法跳出循环?
而用下面的这个,可以正常运行。
#include <stdio.h>
int main(void)

long num;
long sum = 0L;
_Bool input_is_good;
printf("Please enter an integer to be summed ");
printf("(q to quit): ");
scanf_s("%ld", &num);
getchar();
input_is_good = num == 1;
while (input_is_good)

sum = sum + num;
printf("Please enter next integer (q to quit): ");
scanf_s("%ld", &num);
getchar();
input_is_good = num == 1;

printf("Those integers sum to %ld", sum);
getchar();
return 0;

P.S. 我用的是vs2017
还有为什么输入字母就能结束循环?

input_is_good = (scanf_s("%ld", &num) == 1);

只要scanf_s完成一次成功的整形输入,input_is_good就为true

MSDN对scanf_s返回值的解释:

Returns the number of fields successfully converted and assigned; the return
value does not include fields that were read but not assigned. A return value of
0 indicates that no fields were assigned.也就是只有一个变量都没有赋值就才会返回0,只有这种情况才会使得input_is_good 为假

参考技术A 这跟bool逻辑没关系,而是你不了解scanf。scanf的返回值不是被输入参数(实际上也不可能做到这一点)。而是成功赋值参数的个数。你很有探究精神,发现输入字母会退出,这是因为输入字母导致匹配%d失败返回0导致的。反之,不论你输入的是0还是1还是2,都属于赋值成功,所以返回1追问

那为什么第一种不论输什么数字都在循环里,而第二种输入非1的数字就能跳出循环,这两种不应该本质上是一样的吗?

追答

仔细读我的回答,您会发现本质差很多。我的回答对于您的这个问题来说已经足够到位了,当然,如果您对我的回答的理解有问题的话请务必留言。不一定能马上解答,但是一定会回答的。

追问

为什么 input_is_good = (scanf_s("%ld", &num) == 1); 读取scanf的返回值,
而 scanf_s("%ld", &num);
getchar();
input_is_good = num == 1; 读取的就是输入的参数。
十分感谢!

参考技术B 和函数的返回值有关系 参考技术C


如图

以上是关于关于C语言的问题的主要内容,如果未能解决你的问题,请参考以下文章

关于C语言里面指针赋值的类型问题,还有一些关于指针的问题

关于C语言指针的问题

关于C语言的位运算的问题

关于c语言的一个问题

C语言关于while循环的问题

c语言关于文件读写的问题