#include <stdio.h>
#include <stdlib.h>
char* temp=" ";
char char_array[4][100]= {"-11111","-1111","-1110","-1112"};
void str_swap(char** a,char** b);
int main(int argc,char* argv[]) {
int j=0,n=4;
printf("BEFORE str_swap(&char_array[0],&char_array[2]);\n");
for (j=0; j<n; j++) {
printf("char_array[%d] = %s\n",j,char_array[j]);
}
str_swap(&char_array[0],&char_array[2]);
printf("AFTER str_swap(&char_array[0],&char_array[2]);\n");
for (j=0; j<n; j++) {
printf("char_array[%d] = %s\n",j,char_array[j]);
}
return 0;
}
void str_swap(char** str1,char** str2) {
temp = *str1;
*str1 = *str2;
*str2 = temp;
}
大家好:我想在C中进行char *数组元素交换,上面是我的代码。但是我在下面显示的输出没有任何改变。我在这里遗漏了什么?感谢您的帮助。
在str_swap之前(&amp; char_array [0],&amp; char_array [2]);
char_array [0] = -11111
char_array [1] = -1111
char_array [2 ] = -1110
char_array [3] = -1112
之后 str_swap(&amp; char_array [0],&amp; char_array [2]);
char_array [0] = -11111 //应为-1110
char_array [1] = -1111
char_array [2] = -1110 //应该是-11111
char_array [3] = -1112
处理返回0(0x0)执行时间:0.359 s
按任意键 继续。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLEN 1002
char *char_array[MAXLEN];
void str_swap(char const** str1,char const** str2);
int my_compare_func(int,int);
void bubble_sort(int,int(*compare_func)(int,int));
int main(int argc,char* argv[]) {
int n=0,i=0,j=0;
while(scanf("%d",&n)==1) {
i=n;
while(i--) {
scanf("%s",&char_array[i]);
}
printf("BEFORE BULLE SORT\n");
for (j=0; j<n; j++) {
printf("j = %d\n",j);
printf("char_array[%d] = %s\n",j,&char_array[j]);
//printf("char_array[%d] = %s\n",j,char_array[j]);
}
bubble_sort(n,my_compare_func);
printf("AFTER BULLE SORT\n");
for (j=0; j<n; j++) {
printf("j = %d\n",j);
printf("char_array[%d] = %s\n",j,&char_array[j]);
//printf("char_array[%d] = %s\n",j,char_array[j]);
}
system("PAUSE");
}
return 0;
}
int my_compare_func(int x,int y) {
int i=0,res = 0,len_strx=0,len_stry=0;
len_strx = strlen(char_array[x]);
len_stry = strlen(char_array[y]);
if(char_array[x][0]=='-') {
if(char_array[y][0]=='-') {
if(len_strx>len_stry) {
res = -1;
}else if(len_strx<len_stry) {
res = 1;
}else if(len_strx==len_stry) {
i=1;
while((char_array[x][i]==char_array[y][i])&&(char_array[x][i]!='\0')&&(char_array[y][i]!='\0')) {
++i;
}
if(i==len_strx) {
res = 0;
}else if(char_array[x][i]<char_array[y][i]){
res = 1;
}else if(char_array[x][i]>char_array[y][i]) {
res = -1;
}
}
}else if((char_array[y][0]>='0'&&char_array[y][0]<='9')||char_array[y][0]=='+'){
res = -1;
}
}else if((char_array[x][0]>='0'&&char_array[x][0]<='9')||char_array[x][0]=='+') {
if((char_array[y][0]>='0'&&char_array[y][0]<='9')||char_array[y][0]=='+'){
if(len_strx>len_stry) {
res = 1;
}else if(len_strx<len_stry) {
res = -1;
}else if(len_strx==len_stry) {
i=0;
while(char_array[x][i]==char_array[y][i]&&char_array[x][i]!='\0'&&char_array[y][i]!='\0') {
++i;
}
if(i==len_strx) {
res = 0;
}else if(char_array[x][i]<char_array[y][i]){
res = -1;
}else if(char_array[x][i]>char_array[y][i]){
res = 1;
}
}
}else if(char_array[y][0]=='-') {
res = 1;
}
}
return res;
}
void str_swap(char const** str1,char const** str2) {
char const* temp = *str1;
*str1 = *str2;
*str2 = temp ;
}
void bubble_sort(int n,int(*compare_func)(int x,int y)) {
int i=0,j=0,flag=1;
for(i=n-1; (i>0)&&(flag==1); --i) {
flag=0;
for(j=0; j<i; ++j) {
if(compare_func(j,j+1)>0) {
str_swap(&char_array[j],&char_array[j+1]);
flag = 1;
}
}
if(!flag) {
break;
}
}
}
感谢您的所有答案。您的回复非常快。事实上我是 试图解决基本的在线判断问题。请在这里查看:(普通话) http://zerojudge.tw/ShowProblem?problemid=a528
基本上这是一个存储大数字的字符串的排序问题(两者都有 积极和消极)。抱怨发布如此庞大的数额 code.fast.My新问题是,当我的代码运行到行时:
// printf(“char_array [%d] =%s \ n”,j,&amp; char_array [j]);
printf(“char_array [%d] =%s \ n”,j,char_array [j]);
然后控制台应用程序崩溃了!我尝试了一些类似的方法 注释行(即将printf()函数中的%s部分设置为 &amp; char_array [j])。它工作正常,但与我对论证的认识相矛盾> printf()。任何人都可以为我解释一下吗?谢谢:)
答案 0 :(得分:2)
您提供的代码无法编译,&char_array[0]
的类型不是char**
函数期望得到的str_swap
。基本上你可以通过进行这些改变来实现你想要的东西:
#include <string.h>
char temp[100];
...
void str_swap(char* a,char* b);
...
str_swap(char_array[0],char_array[2]);//you don't need to use the & operator here
...
void str_swap(char* str1,char* str2)
{
strncpy(temp,str1,100);//copy the first to temp
strncpy(str1,str2,100);//copy the second to the first
strncpy(str2,temp,100);
}
答案 1 :(得分:2)
是的,你在这里遗漏了一些东西。 char [4][100]
是一个数组数组,而不是一个指针数组。你的函数需要指针的地址,而不是数组的地址(数组不是指针)。
将数组更改为const char*
数组(指向常量字符数据的指针),并且您的函数正确地交换指向该类型指针的指针将解决您的问题。
#include <stdio.h>
#include <stdlib.h>
char const *char_array[4] = {"-11111","-1111","-1110","-1112"};
void str_swap(char const ** str1,char const ** str2);
int main(int argc,char* argv[])
{
int j=0,n=4;
printf("BEFORE str_swap(&char_array[0],&char_array[2]);\n");
for (j=0; j<n; j++) {
printf("char_array[%d] = %s\n",j,char_array[j]);
}
str_swap(&char_array[0], &char_array[2]);
printf("AFTER str_swap(&char_array[0],&char_array[2]);\n");
for (j=0; j<n; j++) {
printf("char_array[%d] = %s\n",j,char_array[j]);
}
return 0;
}
void str_swap(char const ** str1, char const ** str2)
{
char const *temp = *str1;
*str1 = *str2;
*str2 = temp;
}
<强>输出强>
BEFORE str_swap(&char_array[0],&char_array[2]);
char_array[0] = -11111
char_array[1] = -1111
char_array[2] = -1110
char_array[3] = -1112
AFTER str_swap(&char_array[0],&char_array[2]);
char_array[0] = -1110
char_array[1] = -1111
char_array[2] = -11111
char_array[3] = -1112
你的原始代码如何运行是一个谜,因为我使用的C编译器不会允许你甚至编译甚至编译,更不用说运行了。
答案 2 :(得分:2)
要编译代码,你必须将矩阵更改为一个指向文字c-string的指针数组,所以
char char_array[4][100]= {"-11111","-1111","-1110","-1112"};
必须是
char *char_array[4]= {"-11111","-1111","-1110","-1112"};
您的代码应为
#include <stdio.h>
#include <stdlib.h>
char *char_array[]= {"-11111","-1111","-1110","-1112"};
#define ARRAY_SIZE sizeof(char_array)/sizeof(char_array[0])
void str_swap(char** a,char** b);
int main() {
size_t j=0;
printf("BEFORE str_swap(&char_array[0],&char_array[2]);\n");
for (j=0; j<ARRAY_SIZE; j++) {
printf("char_array[%zu] = %s\n",j,char_array[j]);
}
str_swap(&char_array[0],&char_array[2]);
printf("AFTER str_swap(&char_array[0],&char_array[2]);\n");
for (j=0; j<ARRAY_SIZE; j++) {
printf("char_array[%zu] = %s\n",j,char_array[j]);
}
return 0;
}
void str_swap(char** str1, char** str2) {
char* temp;
temp = *str1;
*str1 = *str2;
*str2 = temp;
}
输出
BEFORE str_swap(&char_array[0],&char_array[2]);
char_array[0] = -11111
char_array[1] = -1111
char_array[2] = -1110
char_array[3] = -1112
AFTER str_swap(&char_array[0],&char_array[2]);
char_array[0] = -1110
char_array[1] = -1111
char_array[2] = -11111
char_array[3] = -1112