Scanf for string无法正常工作

时间:2014-01-26 14:31:07

标签: c string

当我运行这个代码。代码应该要求第二个scanf字符串。但它是打印一些垃圾值..请解释这为什么会发生?

int main()
{
    char arr[50];
    int ll;
    char sb[20];
    printf("enter the string\n");
    scanf("%[^\n]s",arr);
    printf("string=%s\n",arr);
    printf("\n enter sub");
    scanf("%[^\n]s",sb);
    printf("\n sub-string=%s",sb);
    return 0;
}

4 个答案:

答案 0 :(得分:3)

我没有测试过自己...

  1. scanf("%[^\n]s",arr);遇到\n

  2. 时停止
  3. stdin仍然保留\n

  4. scanf("%[^\n]s",sb);在第一次人为输入结束时遇到相同的\n时停止

  5. 顺便说一句,最好使用fgetssscanf的组合代替scanf

答案 1 :(得分:1)

替换:

scanf("%[^\n]s",arr);
...
scanf("%[^\n]s",sb);

使用:

scanf("%49s %19s",arr,sb);

答案 2 :(得分:1)

"%[...]" 需要尾随's' "%[...]" 消耗领先的空白区域 无论何时扫描字符串,都包含宽度限制 检查scanf()返回值。

char arr[50];
//         v--- Space added to consume any white-space including any \n
if (scanf(" %49[^\n]", arr) != 1) Handle_Error();
char sb[20];
if (scanf(" %19[^\n]", sb) != 1) Handle_Error();

在OP的原始代码中,OP正在变得垃圾,因为scanf()不起作用。第一个"%[^\n]s"可能正常工作,但在'\n'中留下stdin以进行下一个IO操作。第二个"%[^\n]s"尝试扫描剩余的'\n',因为它与"%[^\n]"不匹配,scanf()停止并且在sb中没有放置任何内容。因此,未初始化的sb包含了它开始使用的任何垃圾。


更好的是,使用fgets()

答案 3 :(得分:0)

如果您不想使用fgets或sscanf

,请使用此代码
int main()
{
    char arr[50];
    int ll;
    char sb[20];
    printf("enter the string\n");
    scanf("%[^\n]s",arr);
    fflush(stdin);//to clear \n from the buffer
    printf("string=%s\n",arr);
    printf("\n enter sub");
    scanf("%[^\n]s",sb);
    printf("\n sub-string=%s",sb);
    return 0;
}