繁体   English   中英

如何使用 scanf() 保存包含多个单词的字符串

[英]How to save a string with multiple words with 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);
}

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

这是修改后的版本:

#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;
}
#include <stdio.h>

#define BUFF_SIZE 512

int main(void) {

    char string[BUFF_SIZE];

    printf("Enter something: ");
    fgets(string, BUFF_SIZE, stdin);
    printf("You entered: %s", string);

    return (0);
}

fgets()是最好的选择

我认为你有问题scanf(); 我建议您从中删除& 那么你的代码应该是这样的:

int main(void) {

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


    return (0);
}

在 c 语言中,没有称为字符串的数据类型。 字符串存储为字符数组

此外,变量本身指向数组的第一个元素。 因此,无需使用“&”运算符来传递地址。

因此,您所要做的就是:

int main(void) {

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

不要在 scanf function 中使用“&”。


int main()
{

   char string[100];
   printf("Please enter something: ");
   scanf("%[^\n]%*c",string);
   printf("You entered: %s", string);
   return 0;
}

根据https://man7.org/linux/man-pages/man3/scanf.3.html%s将忽略空白字符。 要捕获空格,您必须将%c与输入参数的额外大小一起使用,或使用%[格式。 检查scanf是否会在末尾添加\0字节。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM