首页 > 解决方案 > 如何使用 scanf() 保存包含多个单词的字符串

问题描述

我刚开始用 C 编程,我想知道为什么我不能用 scanf() 存储一个包含多个单词的字符串。

例如,我输入:“That's an example”,它只存储第一个单词“That's”

我的代码:

int main(void) {

    char string[100];
    
    printf("Please enter something: ");
    scanf("%s", &string);
    printf("You entered: %s", string);


    return (0);
}

标签: cstringchar

解决方案


您可以scanf()使用字符类转换说明符读取多个单词:%[^\n]将在换行处停止并使其在输入流中挂起。请注意,您必须告知scanf要存储到目标数组中的最大字符数,以避免在长输入行上出现未定义的行为。将数组传递给 时scanf(),不应将其地址传递为&string,而应将其作为 传递string,当作为函数参数传递时,数组衰减为指向其第一个元素的指针。

这是修改后的版本:

#include <stdio.h>

int main(void) {
    char string[100];
    int c;
    
    for (;;) {
        printf("Please enter something: ");
        /* initialize `string` in case the `scanf()` conversion fails on an empty line */
        *string = '\0';
        if (scanf("%99[^\n]", string) == EOF)
            break;
        printf("You entered: %s\n", string);
        /* read the next byte (should be the newline) */
        c = getchar();
        if (c == EOF)   /* end of file */
            break;
        if (c != '\n')
            ungetc(c, stdin);  /* not a newline: push it back */
    }
    return 0;
}

但是请注意,fgets()用于此任务要简单得多:

#include <stdio.h>

int main(void) {
    char string[100];
    
    for (;;) {
        printf("Please enter something: ");
        if (!fgets(string, sizeof string, stdin))
            break;
        /* strip the trailing newline, if any */
        string[strcspn(string, "\n")] = '\0';
        printf("You entered: %s\n", string);
    }
    return 0;
}

推荐阅读