鱼C论坛

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

[已解决]使用C语言输入一串字符串,实现将字符串反序存放,要求不能使用strlen()函数

[复制链接]
发表于 2024-9-12 00:25:29 | 显示全部楼层 |阅读模式

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

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

x
使用C语言输入一串字符串,实现将字符串反序存放,要求不能使用strlen()函数
最佳答案
2024-9-12 00:44:47
轻语远歌 发表于 2024-09-12 00:44
反转字符串这里的循环是怎么实现的,不太理解为啥这莫 ...


好的,鱼油,我来为你详细解释一下。要反转一个字符串,我们需要将字符串前面的字符与后面的字符交换,一直交换到字符串的中间为止。以下是具体步骤:

假设有一个字符串 `str`,包含字符 "hello",其长度为 5。我们要将它反转为 "olleh"。

### 步骤分析:

1. **初始化两个指针**:
   * 一个指针指向字符串的起始位置——`i = 0`(第一个字符)。
   * 一个指针指向字符串的结束位置——`j = length-1`(最后一个字符)。

2. **交换字符**:
   * 交换 `str[i]` 和 `str[j]`。
   * 将 `i` 向右移动一个位置——`i++`。
   * 将 `j` 向左移动一个位置——`j--`。

3. **重复交换** 直到 `i` 大于或等于 `j`,即所有需要交换的字符都已经交换完成。

### 循环示例:
假设字符串 `str` 为 "hello",长度为 5。以下是具体的代码实现:
#include <stdio.h>

void reverseString(char *str) {
    // 计算字符串长度
    int length = 0;
    while (str[length] != '\0') {
        length++;
    }

    // 反转字符串
    for (int i = 0, j = length - 1; i < j; i++, j--) {
        char temp = str[i];
        str[i] = str[j];
        str[j] = temp;
    }
}

int main() {
    char str[100];

    // 输入字符串
    printf("请输入一串字符串:");
    fgets(str, sizeof(str), stdin);

    // 有时 fget() 会读取换行符,我们需要移除它
    if (str[strlen(str) - 1] == '\n') {
        str[strlen(str) - 1] = '\0';
    }

    // 反转字符串
    reverseString(str);

    // 输出反转后的字符串
    printf("反序后的字符串:%s\n", str);

    return 0;
}

### 解释代码中的循环:
1. **for 循环初始化部分**:`int i = 0, j = length - 1`
   * 初始时 `i` 指向字符串的第一个字符,`j` 指向字符串的最后一个字符。
   
2. **循环条件**:`i < j`
   * 当 `i` 小于 `j` 时,继续交换字符。
   
3. **循环体**:
char temp = str[i]; // 用临时变量记录 str[i] 的值
   str[i] = str[j];    // 将 str[j] 的值赋给 str[i]
   str[j] = temp;      // 将临时变量的值赋给 str[j]
   * 即交换 `str[i]` 和 `str[j]`。

4. **更新指针**:`i++` 和 `j--`
   * `i` 向右移动一个位置,`j` 向左移动一个位置。

这个循环过程持续到 `i` 大于或等于 `j`,即所有需要交换的字符都已经交换完成。这样,就实现了字符串的反转。

希望这个解释能帮到你。如果还有其他疑惑,欢迎随时提问哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-9-12 00:31:48 | 显示全部楼层
好的,鱼油。我将为你展示一个不使用 `strlen()` 函数来反转字符串的简单方法。我们可以遍历字符串来计算它的长度,然后再进行反转:
#include <stdio.h>

void reverseString(char *str) {
    // 计算字符串长度
    int length = 0;
    while (str[length] != '\0') {
        length++;
    }

    // 反转字符串
    for (int i = 0; i < length / 2; i++) {
        char temp = str[i];
        str[i] = str[length - 1 - i];
        str[length - 1 - i] = temp;
    }
}

int main() {
    char str[100];

    // 输入字符串
    printf("请输入一串字符串:");
    gets(str);

    // 反转字符串
    reverseString(str);

    // 输出反转后的字符串
    printf("反序后的字符串:%s\n", str);

    return 0;
}

这个程序做了以下几步:
1. 使用 `while` 循环遍历字符串来计算其长度。
2. 使用 `for` 循环来交换字符串首尾字符的位置,直至中间位置,从而实现字符串反转。

请注意,`gets()` 函数已经被废弃,因为它不安全,容易引起缓冲区溢出问题。可以用 `fgets()` 替代,它更安全一些。在实际写代码时请尽量使用 `fgets()`。

如果你有更多问题,欢迎随时提问哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-9-12 00:44:29 | 显示全部楼层
FishC 发表于 2024-9-12 00:31
好的,鱼油。我将为你展示一个不使用 `strlen()` 函数来反转字符串的简单方法。我们可以遍历字符串来计算它 ...

反转字符串这里的循环是怎么实现的,不太理解为啥这莫写
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-12 00:44:47 | 显示全部楼层    本楼为最佳答案   
轻语远歌 发表于 2024-09-12 00:44
反转字符串这里的循环是怎么实现的,不太理解为啥这莫 ...


好的,鱼油,我来为你详细解释一下。要反转一个字符串,我们需要将字符串前面的字符与后面的字符交换,一直交换到字符串的中间为止。以下是具体步骤:

假设有一个字符串 `str`,包含字符 "hello",其长度为 5。我们要将它反转为 "olleh"。

### 步骤分析:

1. **初始化两个指针**:
   * 一个指针指向字符串的起始位置——`i = 0`(第一个字符)。
   * 一个指针指向字符串的结束位置——`j = length-1`(最后一个字符)。

2. **交换字符**:
   * 交换 `str[i]` 和 `str[j]`。
   * 将 `i` 向右移动一个位置——`i++`。
   * 将 `j` 向左移动一个位置——`j--`。

3. **重复交换** 直到 `i` 大于或等于 `j`,即所有需要交换的字符都已经交换完成。

### 循环示例:
假设字符串 `str` 为 "hello",长度为 5。以下是具体的代码实现:
#include <stdio.h>

void reverseString(char *str) {
    // 计算字符串长度
    int length = 0;
    while (str[length] != '\0') {
        length++;
    }

    // 反转字符串
    for (int i = 0, j = length - 1; i < j; i++, j--) {
        char temp = str[i];
        str[i] = str[j];
        str[j] = temp;
    }
}

int main() {
    char str[100];

    // 输入字符串
    printf("请输入一串字符串:");
    fgets(str, sizeof(str), stdin);

    // 有时 fget() 会读取换行符,我们需要移除它
    if (str[strlen(str) - 1] == '\n') {
        str[strlen(str) - 1] = '\0';
    }

    // 反转字符串
    reverseString(str);

    // 输出反转后的字符串
    printf("反序后的字符串:%s\n", str);

    return 0;
}

### 解释代码中的循环:
1. **for 循环初始化部分**:`int i = 0, j = length - 1`
   * 初始时 `i` 指向字符串的第一个字符,`j` 指向字符串的最后一个字符。
   
2. **循环条件**:`i < j`
   * 当 `i` 小于 `j` 时,继续交换字符。
   
3. **循环体**:
char temp = str[i]; // 用临时变量记录 str[i] 的值
   str[i] = str[j];    // 将 str[j] 的值赋给 str[i]
   str[j] = temp;      // 将临时变量的值赋给 str[j]
   * 即交换 `str[i]` 和 `str[j]`。

4. **更新指针**:`i++` 和 `j--`
   * `i` 向右移动一个位置,`j` 向左移动一个位置。

这个循环过程持续到 `i` 大于或等于 `j`,即所有需要交换的字符都已经交换完成。这样,就实现了字符串的反转。

希望这个解释能帮到你。如果还有其他疑惑,欢迎随时提问哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-12 10:29:46 | 显示全部楼层
#include <stdio.h>

char *reverse_string(char *str, unsigned int index) {
    if(!str[index]) return str;
    char ch = str[index];
    char *ptr = reverse_string(str, index + 1);
    *ptr = ch; return ptr + 1;
}

int main(void) {
    char buff[1024];
    scanf("%s", buff);
    reverse_string(buff, 0);
    puts(buff);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-13 17:22:58 | 显示全部楼层
球最佳
要在C语言中实现一个字符串的反转,同时不使用strlen()函数来获取字符串的长度,你可以通过遍历字符串直到遇到空字符(\0)来手动计算字符串的长度,并在遍历过程中同时反转字符串。


#include <stdio.h>  
  
void reverseString(char *str) {  
    if (str == NULL) return; // 检查空指针  
  
    int length = 0; // 初始化长度计数器  
    // 计算字符串长度,并找到最后一个字符  
    char *end = str;  
    while (*end != '\0') {  
        end++;  
        length++;  
    }  
  
    // 使用两个指针从字符串的两端开始向中间遍历,交换字符  
    char *start = str;  
    char temp;  
    for (int i = 0; i < length / 2; i++) {  
        temp = *start;  
        *start = *(end - 1 - i);  
        *(end - 1 - i) = temp;  
        start++;  
    }  
}  
  
int main() {  
    char str[] = "Hello, World!";  
    printf("Original string: %s\n", str);  
  
    reverseString(str);  
  
    printf("Reversed string: %s\n", str);  
  
    return 0;  
}
这段代码首先定义了一个reverseString函数,它接收一个字符指针(即字符串)作为参数。函数内部,首先检查这个指针是否为NULL,以避免潜在的空指针解引用错误。然后,使用一个for循环来遍历字符串直到遇到空字符(\0),同时记录下字符串的长度,并找到字符串的最后一个字符。

接下来,使用两个指针(start和end)分别从字符串的开头和结尾开始,逐步向中间移动,并在移动过程中交换这两个指针所指向的字符。这个交换过程一直进行到两个指针相遇或错过彼此(对于奇数字符串长度的情况)。

最后,在main函数中,我们定义了一个字符串str,调用reverseString函数来反转它,并打印反转前后的字符串以验证结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-4 01:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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