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 元素,因此最终将 print
ing 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);
在这个程序中,我尝试使用 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 元素,因此最终将 print
ing 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);