- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
关于 C 语言,我有 2 个问题。假设我有一个包含这些前缀值的文本文件:
apple
orange
pear
grapes
#
我可以逐字符打印出来,这正是我想要的,但打印输出包括回车和换行,但我希望打印输出是 苹果梨橙葡萄#
第二个问题我正在尝试以这样一种方式制作我的程序,一旦它读取#,我就可以停止读取。这是我的代码示例:
#include <stdio.h>
#include <string.h>
#define size 210
int main()
{
int i;
char info[size];
char stop;
stop = '#';
for (i = 0; i<size; i++)
{
scanf ("%c", &info[i]);
while (info[i] != stop);
{
printf ("%c", info[i]);
}
}
return 0;
}
这段代码似乎可以无限运行。如果我尝试通过使用取消引用 info[i]
while (* info[i] != stop);
我明白了
error: invalid type argument of unary ‘*’ (have ‘int’)
while (*info[i] != stop);
有没有人可以帮我解决这两个问题?
最佳答案
无限问题是你的循环:
while (info[i] != stop);
请注意,分号是循环体。一旦开始循环,每次执行循环都不会发生任何变化以停止它。您应该将 while
更改为 if
并去掉分号。
那么你的问题是你没有从 scanf()
中检测到 EOF;始终检查 scanf()
的返回值。通常,您会使用:
if (scanf("%c", &info[i]) != 1)
break;
但考虑到 %c
将返回 1 除了在 EOF 处,您这次可以将 1
替换为 EOF
,但它会最好学习安全(正确)的方法并使用 1
。
关于不打印CR和LF,打印前测试:
if (info[i] != '\n' && info[i] != '\r')
考虑使用 getchar()
和 putchar()
代替 scanf()
和 printf()
。并在末尾输出一个换行符。
#include <stdio.h>
#define size 210
int main(void)
{
int i;
char info[size];
char stop = '#';
for (i = 0; i < size; i++)
{
if (scanf("%c", &info[i]) != 1 || info[i] == stop)
break;
if (info[i] != '\n' && info[i] != '\r')
printf("%c", info[i]);
}
putchar('\n');
return 0;
}
请注意,这不会终止 info
字符串;您必须循环到 size - 1
并在末尾添加 null。即使文件更长,使用该字符串也是安全的。还要注意 info
字符串包含换行符和回车符,即使输出没有。你必须稍微重新编码循环来处理这个问题。读取输入的字符,如果不是换行符或回车符,则只将其添加到 info
。
如果想在停止前打印停止符,可以使用:
#include <stdio.h>
#define size 210
int main(void)
{
int i;
char info[size];
char stop = '#';
for (i = 0; i < size; i++)
{
if (scanf("%c", &info[i]) != 1)
break;
if (info[i] != '\n' && info[i] != '\r')
printf("%c", info[i]);
if (info[i] == stop)
break;
}
putchar('\n');
return 0;
}
或者,由于您在循环后不使用 info
,您可以简化它(从输出中省略停止字符):
#include <stdio.h>
int main(void)
{
int i;
int c;
char stop = '#';
while ((c = getchar()) != EOF && c != stop)
{
if (c != '\n' && c != '\r')
putchar(c);
}
if (c == stop)
putchar(c);
putchar('\n');
return 0;
}
关于C语言 : How do I ignore carriage return and line feed when reading from text file?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34226977/
我是一名优秀的程序员,十分优秀!