【问题标题】:scanf a string in a char pointer [duplicate]扫描字符指针中的字符串[重复]
【发布时间】:2016-10-21 14:58:41
【问题描述】:

我想扫描一个字符串并将char指针指向这个扫描的字符串。

int main(int argc, char *argv[]) {

    char *string;
    scanf("%s",&string);
    printf("%s\n",string);

}

但是给出警告说

警告:格式“%s”需要“char *”类型的参数,但参数 2 有类型'char **'

如何扫描char * 中的字符串而不出现警告。

编辑:它适用于带有警告的以下代码,我将其深入到上面的代码中,以便非常具体。

int main(int argc, char *argv[]) {

    int n = 2;

    char *strings[2];
    for(int i = 0; i < n; i++){
        scanf("%s",&strings[i]);
        printf("%s\n",&strings[i]);
    }

}

【问题讨论】:

  • 先为字符串变量分配内存,然后只传递string而不是&amp;string
  • 换句话说,当您还没有弄清楚如何分配内存缓冲区时,您正在询问如何使编译器错误消失。
  • ... 或使用固定长度的字符串。这取决于您打算阅读的内容。
  • 当你说“这有效”时,这是否意味着你实际测试过它?因为除了崩溃,我什么也没看到。
  • @interjay 你很可能是正确的,但是,它是 UB .....

标签: c pointers scanf


【解决方案1】:

首先,scanf() 中的%s 需要一个指向char 的指针,而不是一个指向char 的指针

引用C11,第 7.21.6.2 章 / p12,fscanf()强调我的

s
匹配一系列非空白字符。286)

如果不存在l 长度修饰符,则相应的参数应为 指向字符数组初始元素的指针大到可以接受 序列和一个终止的空字符,它将自动添加。 [...]

改变

scanf("%s",&string);

scanf("%s",string);

也就是说,您需要先将内存分配给string,然后才能真正尝试扫描。否则,您最终将使用调用undefined behavior 的未初始化指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多