我试图将多个单词输入和多行输入到一个数组中。但某些地方代码跳过获取输入并跳过结束程序。我已经尝试在'%s'(或'%s')之前和之后添加空格但是它不起作用(也许是因为它在循环中?)。非常感谢任何人的帮助!如果我输入超过两三个字,它也会开始变得怪异:( 我的目标是找到特定字母在所有这些单词和行中出现的次数。
#include <stdio.h> //include standard library
int main(){
int lineCount, occuranceCount;
printf("How many lines are you going to enter?");
scanf("%d", &lineCount);
char input[lineCount][100], searchChar;
for(int i=0; i<lineCount; i++){
printf("Please enter line #%d (100 characters of less):",i+1);
scanf("%s", &input[i]);
}
printf("What letter do you want to check the frequence in those lines? ");
scanf("%c", &searchChar);
for(int j=0; j<lineCount; j++){
for(int k=0; k<100; k++){
if(input[j][k] != '\0'){
if(input[j][k]==searchChar)
occuranceCount++;
}
}
}
printf("The letter occurs for %d time", occuranceCount);
return 0;
}
答案 0 :(得分:7)
scanf(" %c", &searchChar);
^
您需要此处的空格来使用\n
中的任何stdin
。
同样scanf()
会读出一个单词而不是一行(空格分隔的单词)。
最好还是使用strlen(input[j])
来了解您应该阅读的内容。
另一件事,在循环中使用size_t
而不是int
。
将occuranceCount
初始化为0
。
另外,要避免buffer overrun
漏洞攻击,请在代码中使用scanf("%99s", input[i]);
。
为了阅读一行,您可以使用fgets()
。
答案 1 :(得分:4)
1)改变
scanf("%c", &searchChar); --> scanf(" %c", &searchChar);
从前一个\n
scanf
个
2)改变
for(int k=0; k<100; k++){ --> for(int k=0; k<strlen(input[j]); k++){
避免阅读超出实际用户输入。
除此之外:
永远不要scanf("%s", &input[i]);
,因为用户可能会溢出输入缓冲区。至少将其更改为:scanf("%99s", &input[i]);
,但请考虑使用fgets
代替
使用fgets
您的程序可能是:
#include <stdio.h>
int main(){
size_t lineCount = 0, occuranceCount = 0;
printf("How many lines are you going to enter?");
scanf("%zu ", &lineCount);
if (lineCount == 0) return 0; // Input error
char input[lineCount][100], searchChar;
for(size_t i=0; i<lineCount; i++){
printf("Please enter line #%zu (100 characters of less):",i+1);
fgets(input[i], 100, stdin);
}
printf("What letter do you want to check the frequence in those lines? ");
scanf("%c", &searchChar);
for(size_t j=0; j<lineCount; j++){
for(size_t k=0; k<strlen(input[j]); k++){
if(input[j][k]==searchChar) occuranceCount++;
}
}
printf("The letter occurs for %zu time", occuranceCount);
return 0;
}
答案 2 :(得分:2)
使用%s的scanf始终读取,直到遇到''(空白)或'\ n'(新行),因此您始终只能使用scanf(“%s”,s1)读取一个单词...
如果你想阅读你必须使用的空格或新行字符,或fgets(比获取更安全)