1

我编写了以下 C 代码来获取用户的字符串列表。但是存储的字符串给出了奇怪的值。

#include <stdio.h>
#include <stdlib.h>


#define MAX_STRING_LENGTH 50


void readInStrings(char* arr[],int n)
{
  int i=0;
  char line[MAX_STRING_LENGTH];

  for(i=0;i<n;i++){
    arr[i]=malloc(MAX_STRING_LENGTH);
    printf("Enter another string : ");
    scanf("%s",&arr[i]);
    //fgets(&arr[i],MAX_STRING_LENGTH,stdin);
  }



  printf("Strings read in correctly.... \n");

  printf("Displaying out all the strings:   \n");
  for(i=0;i<n;i++){
    printf("%s\n",&arr[i]);
  }
}



void testStringInputs()
{
  printf("Enter the number of entries : ");
  int n;
  scanf("%d",&n);

  char* strings[n];
  readInStrings(strings,n);
}

输入样本:

输入条目数:3
输入另一个字符串:Alladin
输入另一个字符串:Barack Obama
输入另一个字符串:正确读入
的字符串.... 显示所有字符串:
AllaBaraObama
BaraObama
Obama

问题: 1) 为什么一个字符串根本没有作为输入?
2)为什么显示的字符串会这样乱码?

如果我使用gets() 或fgets() 代替scanf(),问题是一样的。

4

3 回答 3

4

arr[i] 已经是一个指针,你不需要 &

于 2011-03-19T04:50:43.223 回答
1

删除 & (如第一个回答者所指出的)scanf("%s",&arr[i]);和 inprintf("%s\n",&arr[i]);对我来说是诀窍。另外,请注意,如果您在编译时使用最高警告,您的编译器会立即告诉您 & 放错了位置。

于 2011-03-19T05:47:43.663 回答
1

Its better to use an array of arrays(two dimensional) instead of array of pointers. I had a tough time correcting your code. So I changed the code to this

#include <stdio.h>
#include <stdlib.h>
#define MAX_STRING_LENGTH 50
void readInStrings(char (*arr)[MAX_STRING_LENGTH],int n)
{
  int i;
  for(i = 0 ; i< n+1; ++i)
   fgets(*(arr+i),MAX_STRING_LENGTH,stdin);
  printf("Strings read in correctly.... \n");
  printf("Displaying out all the strings:   \n");
  for(i=0;i< n+1;i++){
    printf("%s",arr[i]);
  }
}
int main()
{
  printf("Enter the number of entries : ");
  int n;
  scanf("%d",&n);
  char strings[n][MAX_STRING_LENGTH];
  readInStrings(strings,n);
  return 0;
}
于 2011-03-19T05:27:00.143 回答