啊这啧啧啧 发表于 2023-5-7 17:59:30

字符存入有些问题

#include <stdio.h>
#define MAX 1024
int main(){
       
        char arr;
        int k;
        //输入字符
        printf("请输入一串字符:");
        scanf("%s",arr);
        printf("%s",arr);
        int len=sizeof arr/arr;
        //将字符存入数组
        char result;
        int i=0,j=0;
        for(k=0;k<len;k++){
                if(arr==' '){
                continue;//若为空格跳过                //题目
                }else{                                          //用户输入一个英文句子,你的程序将这个字符串按空格进行分割,返回由单词组成的二维数组。
                result=arr;                     
                j++;
                }                                             //这个代码在输出有点问题,空格后的数组内容显示不出来
        }
        //打印
        for(int n=0;n<i;n++){
                for(int m=0;m<j;m++){
                        printf("%c",result);
                }printf("\n");
        }
       
        return 0;
}

isdkz 发表于 2023-5-7 18:02:05

你的代码中有几个问题需要解决。下面是修复后的代码:

#include <stdio.h>
#include <string.h>

#define MAX 1024

int main() {
    char arr;
    int k;

    // 输入字符
    printf("请输入一串字符:");
    fgets(arr, MAX, stdin); // 使用 fgets 替换 scanf 以处理空格

    int len = strlen(arr);

    // 将字符存入数组
    char result;
    int i = 0, j = 0;

    for (k = 0; k < len; k++) {
      if (arr == ' ' || arr == '\n') { // 当遇到空格或换行符时
            result = '\0'; // 在当前行添加字符串结束符
            i++; // 移动到下一行
            j = 0; // 将列索引重置为 0
      } else {
            result = arr;
            j++;
      }
    }
    result = '\0'; // 在最后一个单词末尾添加字符串结束符

    // 打印
    for (int n = 0; n <= i; n++) {
      printf("%s\n", result); // 使用 %s 而不是逐字符打印
    }

    return 0;
}


这个修复的代码有以下更改:

1. 使用fgets()代替scanf()以正确处理包含空格的字符串。
2. 使用strlen()计算字符串长度,而不是sizeof 。
3. 当遇到空格或换行符时,将字符串结束符\0添加到当前行,并将行和列索引适当调整。
4. 在打印二维数组时,直接使用%s而不是逐字符打印。

歌者文明清理员 发表于 2023-5-7 18:02:08

本帖最后由 歌者文明清理员 于 2023-5-7 18:03 编辑

你好!根据你的代码,我发现有几个问题需要注意。

首先,在输入字符后,你用 sizeof 计算了数组 arr 的长度,但这实际上并不是该数组中字符的数目。你可以使用 strlen 函数来获取输入的字符串的长度。

其次,在循环存储字符到二维数组 result 中时,你使用了两个变量 i 和 j 来分别记录行和列的索引,但是你并没有适当地更新行和列的值。你应该在每存储一个字符之后,将列索引 j 加一;如果当前字符是空格,则应该将行索引 i 加一,并且将列索引 j 重置为零。

最后,在打印二维数组时,你使用了错误的索引变量。在循环中,你应该使用变量 n 和 m 分别代表行和列的索引,而不是变量 i 和 j。另外,打印字符时应该使用 result 而不是 result[ i ]。

下面是修改后的代码,仅供参考:

c
#include <stdio.h>
#include <string.h>
#define MAX 1024

int main() {
    char arr;
    int k;
    //输入字符
    printf("请输入一串字符:");
    scanf("%s", arr);
    printf("%s\n", arr);// 输出输入的字符串

    //将字符存入数组
    char result;
    int i = 0, j = 0, len = strlen(arr);
    for (k = 0; k < len; k++) {
      if (arr == ' ') {
            // 若为空格,将列索引 j 重置为零,并将行索引 i 加一
            j = 0;
            i++;
      } else {
            result = arr;// 存储当前字符到二维数组中
            j++;// 列索引加一
      }
    }

    //打印
    for (int n = 0; n <= i; n++) {// 遍历行
      for (int m = 0; m < strlen(result); m++) {// 遍历列
            printf("%c", result);
      }
      printf("\n");
    }

    return 0;
}

sfqxx 发表于 2023-5-7 18:08:00


#include <stdio.h>
#include <string.h> //需要使用到字符串函数库

#define MAX 1024

int main(){
   
    char arr;
    int len;

    //输入字符
    printf("请输入一串字符:");
    scanf("%[^\n]",arr); //使用scanf读取一行字符串,可以包含空格,遇到换行符结束

    len=strlen(arr);
    if(len==0){
      printf("输入的字符为空\n");
      return -1;
    }

    //将字符存入数组
    char result;
    int i=0,j=0,k;
    for(k=0;k<len;k++){
      if(arr==' '){
            result='\0'; //在当前单词结尾处加上\0 ,以便后续字符串处理函数使用
            i++;j=0; //指向下一个单词
      }else{
            result=arr;
            j++;
      }
    }
    result='\0'; //最后一个单词后还需加上\0

    //打印二维数组
    printf("二维数组如下:\n");
    for(int n=0;n<=i;n++){ //注意小于等于i,因为可能存在只有1个单词的情况
      for(int m=0;m<strlen(result);m++){ //按照字符串长度输出
            printf("%c",result);
      }
      printf("\n");
    }

    return 0;
}

这是修改后的代码,主要思路是通过 `scanf("%[^\n]",arr)` 来读取一行字符串,因为如果使用 `%s` ,它会遇到空格或者回车符就结束了,而我们需要一次性输入整行字符串。从输入的字符串中读取每一个单词,并将其存入结果二维数组 `result` 中,最后输出二维数组即可。

还有几个需要注意的地方:

1. 在当前单词结尾处加上 `\0` ,以便后续处理函数使用。在 C 语言中,字符串需要以空字符 `\0` 结尾,这个字符表示字符串的结束。因此在每一个单词的结尾处要加上 `\0`。

2. 最后一个单词后还需要加上 `\0`。因为最后一个单词没有空格或回车符来标记它的结束,所以需要手动加上 `\0`。

3. 内层循环需要按照字符串长度输出。因为每个单词的长度不一定相同,因此需要根据每个单词的长度来循环输出。
有用请设置最佳答案

sfqxx 发表于 2023-5-7 18:15:17

歌者文明清理员 发表于 2023-5-7 18:02
你好!根据你的代码,我发现有几个问题需要注意。

首先,在输入字符后,你用 sizeof 计算了数组 arr 的 ...

把那个 c 删了

歌者文明清理员 发表于 2023-5-7 19:06:21

sfqxx 发表于 2023-5-7 18:15
把那个 c 删了

习惯留着了
页: [1]
查看完整版本: 字符存入有些问题