【问题标题】:Converting lowercase to uppercase using 2D arrays in C使用 C 中的二维数组将小写字母转换为大写字母
【发布时间】:2017-11-12 19:55:39
【问题描述】:

在这里,我想使用二维数组将一些学生姓名转换为大写。这编译没有错误,但在执行时它给出了一个称为“分段错误”的错误。我使用一维数组尝试了这个,但它只打印我输入的姓氏。最后,我想分别计算输入名称的总整数值。我对C语言相当陌生,所以可能会有很多错误。有什么想法可以修复我的代码吗?

#include<stdio.h>

#define SIZE 6

void input(char arr[][10], int size);
void upper(char arr[][10], int size);
void findIntValue(char arr[][10], int size);

int main(void)
{
  char arr[SIZE][10] = {0.0};

  input(arr, SIZE);

  upper(arr, SIZE);

  findIntValue(arr, SIZE);

  return 0;
}

 void input(char arr[][10], int size)
{
  int i, j;

  for(i = 0 ; i < size ; i++)
 {
    printf("\nEnter the name: ");
    scanf(" %s", arr[i]);
 }
}

void upper(char arr[][10], int size)
{
  int i, j;

  for(i = 0 ; i < size && arr[i] != '\0' ; i++)
 {
    for(j = 0 ; j < 10 && arr[i][j] != '\0' ; j++)
    {
        if(arr[i][j] >= 97 && arr[i][j] <= 122)
        {
            arr[i][j] -= 32;
        }
    }
 }

 for(i = 0; i < size && arr[i] != '\0' ; i++)
 {
    for(j = 0 ; j < 10 && arr[i][j] != '\0' ; j++)
    {
        printf("\n%s\n", arr);
    }
 }
}

void findIntValue(char arr[][10], int size)
{
  int i, j;
  int total = 0;

  for(i = 0 ; i < size && arr[i] != '\0' ; i++)
 {
    for(j = 0 ; j < 10 && arr[i][j] != '\0' ; j++)
    {
        total += arr[i][j];

        printf("\n%s\t%d\n", arr, total);

        total = 0;
    }
  }
}

enter image description here

【问题讨论】:

  • char arr[SIZE][10] = {0.0}; 你用double 值初始化了achar 数组。
  • scanf(" %s", arr); 你应该在某处使用i...
  • for(i = 0 ; i &lt; size &amp;&amp; arr[i][j] != '\0' ; i++)你使用了未初始化的变量j
  • 这不会影响您的程序输入或输出。但是,当您定义一个名称为 SIZE 的宏时,不要传递名称为 size 的参数,您可以在整个程序中直接使用 SIZE。
  • @Gerhardh 如果我在第一个 for 循环中省略 'j',它会影响数组 arr[i][j] 吗?

标签: c arrays multidimensional-array uppercase lowercase


【解决方案1】:

你的代码有很多问题。

问题1:在函数输入中,需要将arr[i]作为输入传递给scanf

问题 2:在上层函数中,在第一个循环中,您试图读取 j 的未初始化值,这可能导致未定义的行为。

问题 3:在上面的函数中,在第二个循环中,在 printf 中,您再次使用 arr,而您应该使用 arr[i],而且您不需要两个循环进行打印。一个循环就够了。

问题4:findIntValue的循环和打印逻辑错误。在内循环完成后,您需要打印总计和 arr。另外,打印的值应该是 arr[i] 而不是 arr。

请在下面找到更正后的程序:

#include<stdio.h>

#define SIZE 6

void input(char arr[][10], int size);
void upper(char arr[][10], int size);
void findIntValue(char arr[][10], int size);

int main(void)
{
  char arr[SIZE][10] = {0.0};

  input(arr, SIZE);

  upper(arr, SIZE);

  findIntValue(arr, SIZE);

  return 0;
}

 void input(char arr[][10], int size)
{
  int i, j;

  for(i = 0 ; i < size ; i++)
 {
    printf("\nEnter the name: ");
    scanf(" %s", arr[i]);
 }
}

void upper(char arr[][10], int size)
{
  int i, j;

  for(i = 0 ; i < size && arr[i][0] != '\0' ; i++)
 {
    for(j = 0 ; j < 10 && arr[i][j] != '\0' ; j++)
    {
        if(arr[i][j] >= 97 && arr[i][j] <= 122)
        {
            arr[i][j] -= 32;
        }
    }
 }

 for(i = 0; i < size && arr[i][0] != '\0' ; i++)
 {
        printf("\n%s\n", arr[i]);
 }
}

void findIntValue(char arr[][10], int size)
{
  int i, j;
  int total = 0;

  for(i = 0 ; i < size && arr[i][0] != '\0' ; i++)
 {
    for(j = 0 ; j < 10 && arr[i][j] != '\0' ; j++)
    {
        total += arr[i][j];
    }
        printf("\n%s\t%d\n", arr[i], total);
        total = 0;
  }
}

【讨论】:

  • arr[i] != '\0'在外循环条件下没有多大意义
【解决方案2】:

您以错误的方式使用二维。您需要在scanf() 中提供arr[i]。因为您的数组是一个二维数组,arr[i] 能够存储字符串。因此,您的输入 fn 将包含此语句。 scanf("%s",arr[i]) 与输出功能相同。 希望这会有所帮助:)

【讨论】:

  • 我仍然遇到同样的错误:分段错误:(
  • 不要初始化你的二维数组
  • for(i = 0; i
  • 你只需检查你在哪里使用 %s 给 arr[i]
  • 我已根据您的建议编辑了我的代码。那是对的吗?如果不是,请告诉我正确的版本吗?我删除了“j”并尝试运行代码,没有错误,但只显示我输入的名字,重复 10 次,并且也没有给出正确的整数值:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-04
  • 2015-07-28
  • 1970-01-01
  • 2015-08-07
  • 1970-01-01
  • 2013-07-26
  • 2018-06-16
相关资源
最近更新 更多