C编程 - 反转字符串

时间:2015-01-02 10:34:25

标签: c arrays function

在这个程序中,我尝试使用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;
}

4 个答案:

答案 0 :(得分:2)

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] = '\0';   //Make last index NULL
printf("%s",temporary_string);

答案 1 :(得分: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]== '\0')){//....

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

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

temporary_string[j] = '\0';

注意:一旦修复了此版本的代码,请考虑一些优化。

检查以下代码。

#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]== '\0')){
            continue;
        }else{
            temporary_string[j] = string[i];
            j++;
        }
    }
    temporary_string[j] = '\0';
    printf("debug : temp string is : %s\n",temporary_string);

    return 0;
}

答案 2 :(得分:0)

让你以255开头的循环条件。

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

256是数组越界。

答案 3 :(得分:0)

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