鱼C论坛

 找回密码
 立即注册
查看: 1112|回复: 5

[已解决]字符存入有些问题

[复制链接]
发表于 2023-5-7 17:59:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

#define MAX 1024

int main() {
    char arr[MAX];
    int k;

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

    int len = strlen(arr);

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

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

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

    return 0;
}

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

1. 使用  fgets()  代替  scanf()  以正确处理包含空格的字符串。
2. 使用  strlen()  计算字符串长度,而不是  sizeof 。
3. 当遇到空格或换行符时,将字符串结束符  \0  添加到当前行,并将行和列索引适当调整。
4. 在打印二维数组时,直接使用  %s  而不是逐字符打印。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-7 18:02:05 | 显示全部楼层    本楼为最佳答案   
你的代码中有几个问题需要解决。下面是修复后的代码:
#include <stdio.h>
#include <string.h>

#define MAX 1024

int main() {
    char arr[MAX];
    int k;

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

    int len = strlen(arr);

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

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

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

    return 0;
}

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

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

评分

参与人数 1荣誉 +1 收起 理由
歌者文明清理员 + 1 我们只差了三秒。。

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[n][m] 而不是 result[ i ][j]。

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

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

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

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

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

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-7 18:08:00 | 显示全部楼层
#include <stdio.h>
#include <string.h> //需要使用到字符串函数库

#define MAX 1024

int main(){
    
    char arr[MAX];
    int len;

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

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

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

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

    return 0;
}

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

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

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

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

3. 内层循环需要按照字符串长度输出。因为每个单词的长度不一定相同,因此需要根据每个单词的长度来循环输出。
有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

把那个 c 删了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-7 19:06:21 | 显示全部楼层

习惯留着了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-28 01:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表