无法在C代码中找到错误

时间:2016-07-16 18:33:18

标签: c

当我输入以下代码程序退出之前,我输入字2的任何字符串。即不执行scanf-word2。为什么?我正在使用mac而我无法在codelite和terminal(使用make)中执行第二次scanf

#include <stdio.h>

int main()
{
    char word1[20], word2[20];

    printf("enter word 1 : ");

    scanf("%[^\n]s",&word1);

    printf("enter word 2 : ");

    scanf("%[^\n]s",&word2);

}

4 个答案:

答案 0 :(得分:4)

您正在向scanf()发送错误的参数类型以扫描字符串,不检查空格 ...而是以这种方式使用scanf

scanf("%19[^\n]",word1); 
//and also
scanf(" %19[^\n]",word2); 
// a space in front to consume white spaces and don't put & before string variable 
  • 使用scanf()扫描字符串时,要发送的参数必须是char*但不是char
  • 类型
  • 此处,word1word2的类型为char*,而word1[i]word2[i]的类型为char
  • %19[^\n]只允许扫描19个字符,包括空格(即'\0''\n' ' '),并会留下最后一个用于终止空字符的索引'\0'。这里有19个被称为width field (点击了解更多)

进一步阅读:

Why does everyone say not to use scanf? What should I use instead?

答案 1 :(得分:2)

如果您阅读手册页scanf

然后这一点没有意义

scanf("%[^\n]s",&word1);

应该是

if (scanf("%19[^\n]",word1) == 1) ....

同样适用于word2

修改

对于第2个单词

if (scanf("\n%19[^\n]",word2) == 1) ....

答案 2 :(得分:0)

通过将最大字符数传递给scanf来防止缓冲区溢出,并使用虚拟格式跳过'\n'

#include <stdio.h>

int main(void) {
    char word1[20], word2[20];

    printf("Enter word 1: ");
    fflush(stdout);  // make sure prompt is output
    if (scanf("%19[^\n]%*c", word1) < 1)
        return 1;

    printf("Enter word 2: ");
    fflush(stdout);  // make sure prompt is output
    if (scanf("%19[^\n]%*c", word2) < 1)
        return 1;

    return 0;
}

请注意,使用scanf读取行会产生一些副作用:您无法以这种方式读取空行,并且必须以笨拙的方式对格式字符串中的缓冲区大小进行硬编码。

我建议使用fgets()并以这种方式剥离'\n'

#include <stdio.h>
#include <string.h>

int main(void) {
    char word1[20], word2[20];

    printf("enter word 1 : ");
    fflush(stdout);  // make sure prompt is output
    if (fgets(word1, sizeof word1, stdin) == NULL)
        return 1;

    word1[strcspn(word1, "\n")] = '\0'; // strip the \n if any

    printf("enter word 2 : ");
    fflush(stdout);  // make sure prompt is output
    if (fgets(word2, sizeof word2, stdin) == NULL)
        return 1;

    word2[strcspn(word2, "\n")] = '\0'; // strip the \n if any

    printf("word1: |%s|, word2: |%s|\n", word1, word2);
    return 0;
}

答案 3 :(得分:-1)

您需要在第二个int? nullableValue = null; int intValue = nullableValue.GetValueOrDefault(10); 之前添加getchar() 缓冲区中已有scanf();个字符。在第二个'\n'操作中,它读取该字符并终止该程序。