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