我刚开始编程并想出了一个程序来计算输入中的字符数。
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int number = 0;
int counter = 0;
char sentence[20];
printf("Enter a sentence: ");
scanf("%s", sentence);
while ( sentence[number] != '\n' )
{
counter += 1;
number += 1;
}
printf("no. of characters in sentence you just typed: %d", counter);
return 1;
}
这个程序有一种我无法理解的奇怪行为。它编译时没有错误,但无论我键入多少字符或输入什么字符,它都会显示no。字符为817。
我很好奇为什么817?这真的很奇怪。另外请告诉我如何改进我的代码,因为它没有按预期执行。
答案 0 :(得分:1)
scanf
的 "%s"
读取一个单词,直到第一个空格或制表符或换行符,并且不会在输入中包含任何\n
个字符。你的循环永远不会结束。或者,更准确地说,它将给出C标准所称的“未定义行为”。在实践中,这意味着它将保持循环,直到它在内存中找到换行符(可能从开始的817个位置!),或者到达分配的内存和崩溃的末尾。
答案 1 :(得分:1)
scanf读取输入直到IOException: Sharing violation on path C:\Users\Public\Documents\Unity Projects\textparsing\Assets\Resources\text\time.txt
System.IO.FileStream..ctor (System.String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, Boolean anonymous, FileOptions options) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.IO/FileStream.cs:320)
System.IO.FileStream..ctor (System.String path, FileMode mode, FileAccess access, FileShare share)
(wrapper remoting-invoke-with-check) System.IO.FileStream:.ctor (string,System.IO.FileMode,System.IO.FileAccess,System.IO.FileShare)
System.IO.File.OpenRead (System.String path) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.IO/File.cs:363)
System.IO.StreamReader..ctor (System.String path, System.Text.Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.IO/StreamReader.cs:167)
System.IO.StreamReader..ctor (System.String path)
(wrapper remoting-invoke-with-check) System.IO.StreamReader:.ctor (string)
Textparsing.LoadTextFile (System.String fileName) (at Assets/Textparsing.cs:36)
Textparsing.Update () (at Assets/Textparsing.cs:29)
但不包括它所以:
\n
将导致非法内存访问,导致未定义的行为。如果您确实希望阅读包含[ white-space ]字符的字符串,请使用[ fgets ]。
如果您想计算字符数,请将while ( sentence[number] != '\n' ) // always true for legal array bound
循环更改为
while
答案 2 :(得分:1)
如果您阅读manual page,则scanf
功能不会读取空格。
或许fgets可能是更好的选择,同时将while循环更改为
while (sentence[number] != 0 && sentence[number] != '\n')
答案 3 :(得分:0)
只需更改此行:
while ( sentence[number] != '\n' )
到
while ( sentence[number] != '\0' )
最后和return 0
答案 4 :(得分:-2)
这是一个更好的代码版本来计算字符数
#include <stdio.h>
main(){
double c;
for(n=0; getchar() != EOF; ++n);
printf("%.0f\n", n);
}