警告:格式%s期望类型为char *但参数2的类型为int

时间:2011-12-06 02:00:31

标签: c segmentation-fault gcc-warning

我已经查看了其他相关问题,但没有一个能帮助这个案例 我收到了问题标题中列出的警告,我的main代码如下:

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

  char *rows;  
  int i, n;  

  printf("\nEnter the amount of rows in the telephone pad: ");  
  scanf("%d", &n);  

  rows = (char *) malloc( sizeof( char ) * n );  

  printf("\nNow enter the configuration for the pad:\n");  
  for( i = 0; i < n; i++ ) {  
    scanf("%s", &rows[i]);  
    printf("\n\t%s\n", rows[i]);  
  }  

  return 0;    
}

用户输入一个数字(例如4),该数字将被扫描到n。这个空间是用于电话垫的行。然后,用户将输入用于配置电话簿的n行数。一个例子是:

123
456个
789个
0.0。

所以我很困惑为什么我的上一个printf语句会出现此错误。

注意:我也试过scanf("%s", rows[i]);:仍然有错误。
注2:我试过运行程序。有分段错误 注3:我的.c程序顶部有#include <stdio.h>#include <stdlib.h> 注4:我有这样的程序:gcc -ansi -pedantic -Wall tele.c

感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

rows[i]不是char* - 它不是“字符串”。

(并且你不能在一个字符中放入3个字符(加上空终止符)。)

答案 1 :(得分:2)

正如其他人所指出的那样,你正在为n个字符分配空间,但是你真的想要n行的空间,每个行有4个字符(用户输入3个字符,空终止符) 。

有几种方法可以做到这一点。您可以先分配n char *个变量来指向行,然后为每行分配4个字节:

int main( int argc, char *argv[] )
{
  char **rows;
  int i, n;

  printf("\nEnter the amount of rows in the telephone pad: ");
  scanf("%d", &n);

  rows = malloc( n * sizeof rows[0] );

  printf("\nNow enter the configuration for the pad:\n");
  for( i = 0; i < n; i++ ) {
    rows[i] = malloc(4);
    scanf("%3s", rows[i]);
    printf("\n\t%s\n", rows[i]);
  }

  return 0;
}

或者,您可以预先分配n 4个字符的数组:

int main( int argc, char *argv[] )
{
  char (*rows)[4];
  int i, n;

  printf("\nEnter the amount of rows in the telephone pad: ");
  scanf("%d", &n);

  rows = malloc( n * sizeof rows[0] );

  printf("\nNow enter the configuration for the pad:\n");
  for( i = 0; i < n; i++ ) {
    scanf("%3s", rows[i]);
    printf("\n\t%s\n", rows[i]);
  }

  return 0;
}

答案 2 :(得分:1)

你的printf传入的是char,而不是%s

你说要在字符串'rows'中获取第i个字符。

更重要的是,你的整个技术将会严重失败......

我想你想要一个字符串数组....或者你想将你的scanf改为%c