为什么scanf会跳过获取字符串输入?

为什么scanf会跳过获取字符串输入?,c,char,scanf,getchar,C,Char,Scanf,Getchar,我正在尝试将多个单词输入到一个数组中,并将多行输入到一个数组中。但是在某个地方,代码会跳过获取输入并跳过结束程序。我已尝试在“%s”(或“%s”)前后添加空间,但它不起作用(可能是因为它在循环中?)。非常感谢任何人的帮助!如果我输入两个或三个以上的单词,它也会表现得很奇怪:( 我的目标是找出一个特定的字母在所有这些单词和行中出现了多少次 #include <stdio.h> //include standard library int main(){ int lineCount

我正在尝试将多个单词输入到一个数组中,并将多行输入到一个数组中。但是在某个地方,代码会跳过获取输入并跳过结束程序。我已尝试在“%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;
}
\include//include标准库
int main(){
int行计数、发生计数;
printf(“您要输入多少行?”);
scanf(“%d”、&lineCount);
字符输入[lineCount][100],searchChar;
对于(int i=0;i
您需要这里的空间来使用
stdin
中的任何
\n

另外,
scanf()
会像你想的那样读一个单词而不是一行(空格分隔的单词)

另外,最好使用strlen(input[j])
来知道应该阅读多少

另外,在循环中使用
size\u t
而不是
int

发生次数计数初始化为
0

另外,为了避免
缓冲区溢出
利用漏洞,请在代码中使用
scanf(“%99s”,输入[i]);

要读取行,可以使用
fgets()

1)更改

要清除从先前的
scanf

2) 改变


使用%s的scanf始终读取,直到遇到“”(空白)或“\n”(新行),因此您始终只能使用scanf读取一个字(“%s”,s1)


如果要读取空格或新行字符,必须使用gets或fgets(比gets更安全)

,这是
fgets
(或POSIX
getline
)的主要原因之一建议用于用户输入,而不是
scanf(
scanf
,这对于粗心的人来说是一个很大的陷阱…无论您使用哪种输入函数,您都必须验证返回,以确信在下次尝试访问您试图读取的内容时不会调用未定义的行为。
scanf(“%s”,&input[i]);
->
scanf(“%99s”,输入[i]);
它为什么会出现skps的摘要?(1)您使用
scanf(“%d”…)
进行阅读,这会留下
“\n”
(从用户在
stdin中按Enter键开始)(2)您调用
scanf(“%s”…)
格式说明符从开始一直读到第一个空格,因此不读取任何内容(
'\n'
是空白)它不会从
标准输入中删除;(3)你调用
scanf(“%c”…)
,它愉快地接受
'\n'
作为输入字符,(4)你无法检查所有调用的返回。“寻求调试帮助的问题(“为什么这段代码不工作?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现问题所需的最短代码。没有明确问题说明的问题对其他读者没有用处。请参阅:如何创建问题!“您的问题缺少输入到程序中并从程序中接收的准确输入/输出。
scanf(“%zu”,&lineCount);
直到在行计数后输入一行非空白文本才会返回。将
scanf()
fgets()
混合是一项挑战。最好只使用
fgets()
  scanf(" %c", &searchChar);
         ^
  scanf("%c", &searchChar); -->   scanf(" %c", &searchChar);
for(int k=0; k<100; k++){ --> for(int k=0; k<strlen(input[j]); k++){
#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;
}