- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我到处都读到,如果你从事计算机科学,C 是大学毕业前必须掌握的语言。我拿起了教授推荐的《里奇和克尼汉》第二版。我对这个程序是如何工作的感到很困惑。如果有人能解释一下那就太好了!该程序计算每个数字、空格和其他字符的出现次数。我为我已经理解的事情写了评论,并在我不明白它是如何工作的地方添加了问题。
#include <stdio.h>
int main()
{
int c, i, nwhite, mother; //Declaring variables
int ndigit[10]; //Declaring an array that holds indexes from 0-9
nwhite = nother = 0; //Initializes two variables to 0
for (i = 0; i < 10; ++i) //Does this for loop keep going through and for each index
ndigit[i] = 0; //0-9 set the value of it to 0?
white ((c = getchar()) !=EOF) //While loop to check if char at EOF
{
if (c>='0' && c <= '9') //Completely lost on how this works?
++ndigit[c - '0'];
else if (c == ' ' || c == '\n' || c == '\t') //Checks for white space
++nwhite;
else //If nothing else increment char variable
++nother;
printf("digits "); //First for loop traverses and prints each value of
for (i=0; i<10; ++i) //the index. The next printf prints white space and
printf(" %d", ndigit[i]); //other characters
printf(", white space = %d, other = other = %d\n", nwhite, nother);
}
最佳答案
int ndigit[10]; //Declaring an array that holds indexes from 0-9
for (i = 0; i < 10; ++i) //Does this for loop keep going through and for each index
在 C 中,数组的索引是从 0 开始的,因此在这种情况下,ndigit
的有效索引是 0 到 9(含)。 for 循环从 i = 0
开始并将 i
递增一个 ( ++i
) 只要 i < 10
,因此循环体将针对 i
的值从 0 到 9 执行,包括 0 和 9。
在这个程序中,留给读者去弄清楚这两个 10
字面值是同一个东西;可以说,将 #define
设为常量并在两个地方都使用它会更好(但在这种情况下,它可能会被原谅,因为小数位数为 10 常量)。
while ((c = getchar()) !=EOF) //While loop to check if char at EOF
getchar
返回从标准输入读取的一个字符,或 EOF
(其值不同于任何 char
)如果标准输入位于文件末尾。没有 EOF
字符表示这种情况。
if (c>='0' && c <= '9') //Completely lost on how this works?
十进制数字 0 到 9 的字符值在 ASCII 和大多数其他字符集中是连续的,因此此代码利用了这一点并检查 c
是否等于或大于 '0'
和 (&&
) 也等于或小于 '9'
。换句话说,这会检查 c
是否在 '0'
和 '9'
之间(含)。 '0'
和 '9'
是字 rune 字,它们具有字符集中相应字符的整数值——这样程序员就不必知道并写入它们的值 if (c>=48 && c<=57)
,只要数字字符连续,代码就可以处理不兼容的字符集值(value)观。
++ndigit[c - '0'];
这会计算每个数字出现的次数。同样,由于表示数字的字符是连续的,因此从读取的字符中减去第一个数字 ('0'
) 的值会导致相应字符的值从 0 到 9,这也是数组 ndigit
的有效索引,如上所述.当然,这个减法只适用于数字字符,这就是前面的 if
检查它的原因。
例如,在 ASCII 中 '0'
的值为 48,'1'
为 49,等等。因此,如果 c
为 '1'
,则减去 c - '0'
的结果为 '1'-'0'
,即 49-48,或 1
++
运算符递增 ndigit
数组相应索引中的值。 (第一个 for
循环将 ndigit
中的初始值设置为零。)
关于Ritchie 和 Kernighan 混淆的 C 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21959168/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!