C 编程 - 反转字符串

C programming - Inverting a string

在这个程序中,我尝试使用 2 个数组反转字符串: 这里的问题是程序一直写字符 "P" 作为唯一的输出,我似乎无法弄清楚如何解决这个问题。

#include<stdio.h>
#include<string.h>
#define TAM 256

int get_string(char string[TAM]);    
int invert_string(char string[TAM]);    
int string_out(char string[TAM]);

int main(){
    char string[TAM]={0};  // always initialize a string to be completely zero, or unexpected behaviour may occur    
    get_string(string);
    invert_string(string);

    return 0;
}

int get_string(char string[TAM]){
    printf("Enter a string: ");
    scanf("%s",string);
    return 0;
}

int invert_string(char string[TAM]){
    char temporary_string[TAM]={0};
    int i,j;

    for(i=TAM,j=0;i>=0;i--){
        if(string[i]== ' '){
            continue;
        }else{
            temporary_string[j] = string[i];
            j++;
        }
    }
    printf("debug : temp string is : %s",temporary_string);
    return 0;
}

int string_out(char string[TAM]){
    printf("%s",string);
    return 0;
}

对于arr[256]的数组声明/定义,最后一个元素是arr[255]

在你的 for() 循环中,

for(i=TAM,j=0;i>=0;i--)

您正在访问 arr[256] [第 267 个元素,考虑到索引从 0] 开始,这是越界访问,因此会产生 undefined behavior.

那么,源数组中的终止 NULL 应该单独处理。

你需要有类似的东西

if((string[i]== ' ') || (string[i]== '[=11=]')){//....

否则,终止 NULL 将成为目标数组中的第一个 vaild 元素,因此最终将 printing nothing.

最后,不要忘记以 NULL 终止新数组。

temporary_string[j] = '[=12=]';

注意:修复此版本的代码后,考虑进行一些优化。

检查下面的代码。

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

#define TAM 256

int get_string(char string[TAM]);

int invert_string(char string[TAM]);

int string_out(char string[TAM]);

int main(){
    char string[TAM]={0};  // always initialize a string to be completely zero, or unexpected behaviour may occur

    get_string(string);
    invert_string(string);

    return 0;
}

int get_string(char string[TAM]){
    printf("Enter a string: ");
    scanf("%s",string);

    return 0;
}

int invert_string(char string[TAM]){
    char temporary_string[TAM]={0};
    int i,j;

    for(i=TAM-1,j=0;i>=0;i--){
        if((string[i]== ' ') || (string[i]== '[=13=]')){
            continue;
        }else{
            temporary_string[j] = string[i];
            j++;
        }
    }
    temporary_string[j] = '[=13=]';
    printf("debug : temp string is : %s\n",temporary_string);

    return 0;
}

让你从 255 开始循环条件。

for ( i=TAM-1 ; j=0; i>=0 ; i--)
   ...

256为数组越界

您的代码有很多问题。起初你不能像我在评论中提到的那样从 256 开始。同样,您不知道源字符串的长度是多少。即使您将大小设置为 256,从终端输入的字符串的长度也可能小于 256。因此,首先您必须知道从终端输入的字符串的大小。之后从 strlen(string) - 1 开始并复制直到 i 变为 0。然后执行 temporary_string[strlen(string)-1]='\0'

invert_string 函数中尝试此代码:

int i,j;
for(i=strlen(string)-1,j=0;i>=0;i--){ // u can take variable and save length or directly pass length
    if(string[i]== ' '){
        continue;
    }else{
        temporary_string[j++] = string[i];
    }
}
temporary_string[j] = '[=10=]';   //Make last index NULL
printf("%s",temporary_string);