关于《C程序设计语言》中某段程序的有关问题!
关于《C程序设计语言》中某段程序的问题!!
#include <stdio.h>
#define MAXLINE 1000 /* maximum input line length */
int getline(char line[], int max);
int strindex(char source[], char searchfor[]);
char pattern[] = "ould"; /* pattern to search for */
/* find all lines matching pattern */
main()
{
char line[MAXLINE];
int found = 0;
while (getline(line, MAXLINE) > 0)
if (strindex(line, pattern) >= 0) {
printf("%s", line);
found++;
}
return found;
}
/* getline: get line into s, return length */
int getline(char s[], int lim)
{
int c, i;
i = 0;
while (--lim > 0 && (c=getchar()) != EOF && c != '\n')
s[i++] = c;
if (c == '\n')
s[i++] = c;
s[i] = '\0';
return i;
}
/* strindex: return index of t in s, -1 if none */
int strindex(char s[], char t[])
{
int i, j, k;
for (i = 0; s[i] != '\0'; i++) {
for (j=i, k=0; t[k]!='\0' && s[j]==t[k]; j++, k++)
;
if (k > 0 && t[k] == '\0')
return i;
}
return -1;
}
全部程序如上图 选自《The C Programming Language》Chapter 4 Functions and Program Structure
里面的第一节1.Basics of Functions
这个函数的功能是 从多行文字中 找到包含字符串“ould”的行 并把这些行逐个打印出来
我有以下问题:
1.如何确保getline函数每次读取的是下一行文字,而不是从整段文字重头开始读?(可能和getchar函数的性质有关)
2.程序可以编译,运行后,通过“shift+回车”来换行输入多行文字。但是一旦输入的行中含有“ould”,那“shift+回车”按下后,就不再是换行,而是自动输出了刚才输入的含有“ould”的行。
这样程序本身就失去了原先定义的功能。原因是什么?怎样才能解决并实现最初定义的功能呢?(我是在WIN下用C-free来编译,运行在类似CMD的环境里)
3.假设以上功能都能实现,打印出来的多行文字,能否自动换行,会不会都在一行上挤成一块呢?
我的担心源于printf("%s", line);里面没有'\n'符号
请各位大虾指教!
------解决方案--------------------
1、getchar是从stdin中取字符,那么字符取出后stdin中就没有那个字符了,对应的是下一个字符
2、可以使用重定向、管道等输入方式
3、在getline方法中已经添加了'\n',所以不会打印在一行上。
if (c == '\n')
s[i++] = c;
------解决方案--------------------
while (--lim > 0 && (c=getchar()) != EOF && c != '\n')
c != '\n' 当有会车时,就结束了。。如果不需要回车结束,就把这个给去掉!!!以EOF来结束。。
#include <stdio.h>
#define MAXLINE 1000 /* maximum input line length */
int getline(char line[], int max);
int strindex(char source[], char searchfor[]);
char pattern[] = "ould"; /* pattern to search for */
/* find all lines matching pattern */
main()
{
char line[MAXLINE];
int found = 0;
while (getline(line, MAXLINE) > 0)
if (strindex(line, pattern) >= 0) {
printf("%s", line);
found++;
}
return found;
}
/* getline: get line into s, return length */
int getline(char s[], int lim)
{
int c, i;
i = 0;
while (--lim > 0 && (c=getchar()) != EOF && c != '\n')
s[i++] = c;
if (c == '\n')
s[i++] = c;
s[i] = '\0';
return i;
}
/* strindex: return index of t in s, -1 if none */
int strindex(char s[], char t[])
{
int i, j, k;
for (i = 0; s[i] != '\0'; i++) {
for (j=i, k=0; t[k]!='\0' && s[j]==t[k]; j++, k++)
;
if (k > 0 && t[k] == '\0')
return i;
}
return -1;
}
全部程序如上图 选自《The C Programming Language》Chapter 4 Functions and Program Structure
里面的第一节1.Basics of Functions
这个函数的功能是 从多行文字中 找到包含字符串“ould”的行 并把这些行逐个打印出来
我有以下问题:
1.如何确保getline函数每次读取的是下一行文字,而不是从整段文字重头开始读?(可能和getchar函数的性质有关)
2.程序可以编译,运行后,通过“shift+回车”来换行输入多行文字。但是一旦输入的行中含有“ould”,那“shift+回车”按下后,就不再是换行,而是自动输出了刚才输入的含有“ould”的行。
这样程序本身就失去了原先定义的功能。原因是什么?怎样才能解决并实现最初定义的功能呢?(我是在WIN下用C-free来编译,运行在类似CMD的环境里)
3.假设以上功能都能实现,打印出来的多行文字,能否自动换行,会不会都在一行上挤成一块呢?
我的担心源于printf("%s", line);里面没有'\n'符号
请各位大虾指教!
------解决方案--------------------
1、getchar是从stdin中取字符,那么字符取出后stdin中就没有那个字符了,对应的是下一个字符
2、可以使用重定向、管道等输入方式
3、在getline方法中已经添加了'\n',所以不会打印在一行上。
if (c == '\n')
s[i++] = c;
------解决方案--------------------
while (--lim > 0 && (c=getchar()) != EOF && c != '\n')
c != '\n' 当有会车时,就结束了。。如果不需要回车结束,就把这个给去掉!!!以EOF来结束。。