C 如何使用此代码对字符串进行排序?我基本功不及格
我正在尝试对输入的城市名称进行排序。下面的代码对我来说似乎是正确的,但尽管它确实成功编译了,但它并没有像我预期的那样工作 我理解指针失败了吗?如果以下是正确的,请允许我更正: 名称类型是字符** 名称[0]类型为字符* 如果我想在使用strcmp检查字符串是否较大后交换字符串,我必须更改名称[I]和名称[j]中的值,因为这些值中的值是指向实际城市名称的指针。当这些字符互换时,它们指向彼此的字符数组,我就完成了。 如果我的第三个想法是正确的,我必须将参数作为char*传递给swap函数,因为swap函数将名称[I]和名称[j]作为参数,它们的类型是char* 在编写下面的代码时,思路与上面的一样。但我的逻辑似乎失败了,因为代码并没有按预期工作C 如何使用此代码对字符串进行排序?我基本功不及格,c,C,我正在尝试对输入的城市名称进行排序。下面的代码对我来说似乎是正确的,但尽管它确实成功编译了,但它并没有像我预期的那样工作 我理解指针失败了吗?如果以下是正确的,请允许我更正: 名称类型是字符** 名称[0]类型为字符* 如果我想在使用strcmp检查字符串是否较大后交换字符串,我必须更改名称[I]和名称[j]中的值,因为这些值中的值是指向实际城市名称的指针。当这些字符互换时,它们指向彼此的字符数组,我就完成了。 如果我的第三个想法是正确的,我必须将参数作为char*传递给swap函数,因为swa
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int i,j;
char *temp;
void swap(char *, char *);
int main(void){
char *names[4];
//gets city names
puts("Enter 4 city names:");
for (i = 0; i < 4; i++)
{
names[i]=malloc(100);
fgets(names[i],99,stdin);
}
//bubble sort names array and swap if necessary
for (i = 0; i < 3; i++)
{
for (j = i+1; j<4 ; j++)
{
if (strcmp (names[i],names[j]) >0 )
{
swap(names[i], names[j]);
}
}
}
puts("Printing sorted array");
for (i = 0; i < 4; i++)
{
printf("%s", names[i]);
}
getch();
}
void swap(char *first, char *second){
temp=first;
first=second;
second=temp;
}
您的swap函数对传递的指针没有任何影响,您需要这样更改它,以便修改传递的指针:
swap(&names[i], &names[j]);
void swap(char **first, char **second)
{
temp=*first;
*first=*second;
*second=temp;
}
您的swap函数对传递的指针没有任何影响,您需要这样更改它,以便修改传递的指针:
swap(&names[i], &names[j]);
void swap(char **first, char **second)
{
temp=*first;
*first=*second;
*second=temp;
}
您需要向指针传递一个指针:
void swap(char **first, char **second)
{
char *temp = *first;
*first = *second;
*second = temp;
}
实际上,您只是修改指针的副本,而不是原始指针。我们使用指针来查看原始…因此您需要指向指针的指针;您正在修改指针
为了让您了解它,我建议您将字符串指针替换为int,并对其进行排序。如果是ints,则对交换函数进行排序时会显示如下:
void swap(int first, int second) // These ints/parameters have been copied
{
first = second; // This only modifies the local copy
// etc..
}
void swap(char **arr, int x, int y) {
char *temp;
temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
swap(names, i, j);
要修改原始值,需要使用指针:
void swap(int *first, int *second)
{
*first = *second;
// etc...
}
您需要向指针传递一个指针:
void swap(char **first, char **second)
{
char *temp = *first;
*first = *second;
*second = temp;
}
实际上,您只是修改指针的副本,而不是原始指针。我们使用指针来查看原始…因此您需要指向指针的指针;您正在修改指针
为了让您了解它,我建议您将字符串指针替换为int,并对其进行排序。如果是ints,则对交换函数进行排序时会显示如下:
void swap(int first, int second) // These ints/parameters have been copied
{
first = second; // This only modifies the local copy
// etc..
}
void swap(char **arr, int x, int y) {
char *temp;
temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
swap(names, i, j);
要修改原始值,需要使用指针:
void swap(int *first, int *second)
{
*first = *second;
// etc...
}
您的交换函数不正确,无法分配这样的字符串。你需要像这样的非最优的东西
void swap(char *a, char *b) {
char tmp[256];
strcpy(tmp, a);
strcpy(a, b);
strcpy(b, tmp);
}
您的交换函数不正确,无法分配这样的字符串。你需要像这样的非最优的东西
void swap(char *a, char *b) {
char tmp[256];
strcpy(tmp, a);
strcpy(a, b);
strcpy(b, tmp);
}
您的交换函数无效。因为我觉得这对你来说并不明显,让我们用一个简单的例子来尝试 如果要交换两个整数,函数将采用int而不是char*。你的函数应该是我刚刚用int替换了char*: 当您使用a和b2 int变量调用swapa、b时,它们的值被复制到first in second中。然后交换第一个和第二个变量的包含。重要的一点是,您不需要更改原始变量a和b 正确的功能是:
void swap(int *first, int *second){
int temp=*first;
*first=*second;
*second=temp;
}
因为这样,您可以传递变量的地址,并以这种方式修改原始变量。如果不清楚,您应该记录什么是指针以及它是如何工作的
现在,您可以通过char*将int改回:
您的交换函数无效。因为我觉得这对你来说并不明显,让我们用一个简单的例子来尝试 如果要交换两个整数,函数将采用int而不是char*。你的函数应该是我刚刚用int替换了char*: 当您使用a和b2 int变量调用swapa、b时,它们的值被复制到first in second中。然后交换第一个和第二个变量的包含。重要的一点是,您不需要更改原始变量a和b 正确的功能是:
void swap(int *first, int *second){
int temp=*first;
*first=*second;
*second=temp;
}
因为这样,您可以传递变量的地址,并以这种方式修改原始变量。如果不清楚,您应该记录什么是指针以及它是如何工作的
现在,您可以通过char*将int改回:
问题不在于指针,而在于函数调用。将值传递给函数并修改该值时,值的来源不一定会更改
void swap(char **first, char **second) {
char *temp;
temp=*first;
*first=*second;
*second=temp;
}
swap(&names[i], &names[j]);
或者你可以这样做:
void swap(int first, int second) // These ints/parameters have been copied
{
first = second; // This only modifies the local copy
// etc..
}
void swap(char **arr, int x, int y) {
char *temp;
temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
swap(names, i, j);
在第一种情况下,将两个地址传递给函数,其内容将被更改。在第二次传递主数组地址和两个位置。问题不在于指针,而在于函数调用。将值传递给函数并修改该值时,值的来源不一定会更改
void swap(char **first, char **second) {
char *temp;
temp=*first;
*first=*second;
*second=temp;
}
swap(&names[i], &names[j]);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int i,j;
char *temp;
void swap(char **, char **);
int main(void){
char *names[4];
//gets city names
puts("Enter 4 city names:");
for (i = 0; i < 4; i++)
{
names[i]=malloc(100);
fgets(names[i],99,stdin);
}
//bubble sort names array and swap if necessary
for (i = 0; i < 3; i++)
{
for (j = i+1; j<4 ; j++)
{
if (strcmp (names[i],names[j]) >0 )
{
swap(&names[i], &names[j]);
}
}
}
puts("Printing sorted array");
for (i = 0; i < 4; i++)
{
printf("%s", names[i]);
}
}
void swap(char **first, char **second){
temp=*first;
*first=*second;
*second=temp;
}
或者你可以这样做:
void swap(int first, int second) // These ints/parameters have been copied
{
first = second; // This only modifies the local copy
// etc..
}
void swap(char **arr, int x, int y) {
char *temp;
temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
swap(names, i, j);
在第一种情况下,将两个地址传递给函数,其内容将被更改。第二步是传递主数组地址和两个位置。另外,冒泡排序基本上就是魔鬼。你需要传递一个指向指针的指针:你能解释一下吗
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int i,j;
char *temp;
void swap(char **, char **);
int main(void){
char *names[4];
//gets city names
puts("Enter 4 city names:");
for (i = 0; i < 4; i++)
{
names[i]=malloc(100);
fgets(names[i],99,stdin);
}
//bubble sort names array and swap if necessary
for (i = 0; i < 3; i++)
{
for (j = i+1; j<4 ; j++)
{
if (strcmp (names[i],names[j]) >0 )
{
swap(&names[i], &names[j]);
}
}
}
puts("Printing sorted array");
for (i = 0; i < 4; i++)
{
printf("%s", names[i]);
}
}
void swap(char **first, char **second){
temp=*first;
*first=*second;
*second=temp;
}
再进一步,为什么?我在这方面遗漏了一些要点。请使用ints添加更多解释。一旦你明白你需要在你的思维中用char*替换int,因此一个指向指针的指针。。。指向char*names[0]类型的指针为char*是否为真?正确!为了使事情变得混乱,可以将字符串定义为chars char MyString[100]数组或指针char*PointyString=Hi。您拥有的是一个char*数组:一个字符串数组,然后分配并从流中读取。此外,冒泡排序基本上是一个魔鬼。您需要向指针传递一个指针:您能进一步解释一下为什么吗?我在这方面遗漏了一些要点。请使用ints添加更多解释。一旦你明白你需要在你的思维中用char*替换int,因此一个指向指针的指针。。。指向char*names[0]类型的指针为char*是否为真?正确!为了使事情变得混乱,可以将字符串定义为chars char MyString[100]数组或指针char*PointyString=Hi。您拥有的是一个char*数组:一个字符串数组,然后分配并从流中读取。我是否应该更改名称[I]和名称[j]的内容,而不是它们的地址?为什么必须将地址传递给函数?请解释一下。这是我不明白的一点。+1,可能在swap中声明temp以减少混乱。我不应该更改名称[I]和名称[j]的内容而不是它们的地址吗?为什么必须将地址传递给函数?请解释一下。这是我不明白的一点。+1,可能temp可以在swap中声明以减少混乱。这应该可以工作,但他想交换指针。这不仅更快而且更安全,如果有人因为这个原因更改了字符串的长度或来源,那么使用strncpy或实现边界检查也会更明智。@lserni我再次给出了红色答案,仍然没有看到显式提示,而OP希望交换指针,而不是数组内容。当然,我必须同意,大多数情况下,您的版本会更快,但这取决于位置和实际大小,而数组大小是硬编码来处理这个特定示例的。但是我强烈不同意strncpy-这个函数会在你最不期待的时候击中你的头部。我的意思是,如果大小不够,它将忽略\0,而如果字符串较短,它将用零填充剩余的大小-开销!。strlcpy好得多,但不标准。这应该行得通,但他想交换指针。这不仅更快而且更安全,如果有人因为这个原因更改了字符串的长度或来源,那么使用strncpy或实现边界检查也会更明智。@lserni我再次给出了红色答案,仍然没有看到显式提示,而OP希望交换指针,而不是数组内容。当然,我必须同意,大多数情况下,您的版本会更快,但这取决于位置和实际大小,而数组大小是硬编码来处理这个特定示例的。但是我强烈不同意strncpy-这个函数会在你最不期待的时候击中你的头部。我的意思是,如果大小不够,它将忽略\0,而如果字符串较短,它将用零填充剩余的大小-开销!。strlcpy好得多,但不标准。谢谢你的回答。谢谢你的回答。非常感谢你的回答。帮了我。非常感谢你的回答。帮助了我。