我是C语言的新手,有人可以帮助确定我在实现计算空白,制表符和换行符的程序时遇到了什么错误。
代码:
#include <stdio.h>
//Write a program to count blanks, tabs, and newlines.
int main(){
char str[100];
printf("Enter the text");
scanf("%s",&str);
int space=0;
int tabs=0;
int newLine=0;
int i=0;
while(str[i]!='\0'){
if (str[i] == ' ')
space++;
if (str[i] == '\t')
tabs++;
if (str[i] == '\n')
newLine++;
i++;
}
printf("space:%d\ntabs:%d\nnew line:%d",space,tabs,newLine);
return 0;
}
答案 0 :(得分:0)
程序中使用的scanf
函数不安全,不允许计算空格。
<小时/> 注意。考虑到而不是
scanf("%s",&str);
^^^
写
是正确的scanf("%s",str);
^^^
根据C标准函数main,不带参数应声明为
int main( void )
最好使用函数fgetc
例如
#include <stdio.h>
int main(void)
{
unsigned int space = 0;
unsigned int tabs = 0;
unsigned int newLine = 0;
printf( "Enter the text: " );
int c;
while ( ( c = fgetc( stdin) ) != EOF )
{
switch ( c )
{
case ' ':
++space;
break;
case '\t':
++tabs;
break;
case '\n':
++newLine;
break;
}
}
printf( "\nspace: %u\ntabs: %u\nnew line: %u\n", space, tabs, newLine );
return 0;
}
如果要输入这样的文字
Hi, Marco Roberts
Welcome to SO
然后程序输出看起来像
space: 4
tabs: 0
new line: 2
使用Ctrl + z或Ctrl + d(取决于使用的系统)来中断输入。
另一种方法可以采用以下方式
#include <stdio.h>
#define N 100
int main(void)
{
unsigned int space = 0;
unsigned int tabs = 0;
unsigned int newLine = 0;
printf( "Enter the text: " );
char str[N];
while ( fgets( str, sizeof( str ), stdin ) )
{
for ( const char *p = str; *p; ++p )
{
switch ( *p )
{
case ' ':
++space;
break;
case '\t':
++tabs;
break;
case '\n':
++newLine;
break;
}
}
}
printf( "\nspace: %u\ntabs: %u\nnew line: %u\n", space, tabs, newLine );
return 0;
}
答案 1 :(得分:0)
更好的检查方法是比较ascii值。 C认为所有字符都在ascii中,而且就C而言。因此,不要将空间与空格进行比较,而是将其与0x20(ascii空格字符的十六进制代码)进行比较。同样适用于其他比较,它应该更好一点。
不要害怕向终端提供关于比较结果的印刷声明。例如,打印正在检查的字符与正在检查的字符以及结果。这将帮助您调试这里实际发生的事情。完成后不要忘记删除那些打印语句。
PS这里是ascii表的链接。 http://www.asciitable.com
答案 2 :(得分:0)
如果你想进行控制台输入(如评论中的@xing所述),你应该使用fgets
而不是scanf
。所以我们将:
#define SIZE_MAX 255
int main() {
char str[SIZE_MAX];
int i;
int space;
int tabs;
printf("Enter the text : ");
fgets(str, SIZE_MAX, stdin); //stdin if it is a console input
// Careful, if the input length is shorter than the SIZE_MAX (here 255),
// Then a '\n' will be added at the end of your string. To counter it :
if(strchr(str, '\n') != 0) { //checks if there is a '\n'
str[strlen(str)-1] = '\0'; //changes it to a '\0' (end of string)
}
//For the verifications, you can do that :
for(i=0 ; i < strlen(str) ; i++) {
if (str[i] == ' ') {
space++;
}
if (str[i] == '\t') {
tabs++;
}
}
printf( "\nspace : %d\ntabs: %d\n", space, tabs);
//NB : There will be no newLine because it is a console input.
return 0;
}