- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 C 中指针的新手,请耐心等待。我正在尝试编写一个函数,如果找到字符串,则返回数组的索引,否则存储字符串,然后返回索引。我想创建一个像这样的结构 {"1234", "3241", "2234", "2222"}
我已经为其动态分配了一个像这样的 char 数组(我需要获取大小从命令行)
char** userToRdrMap = {NULL};
userToRdrMap = malloc(numOfReducers * sizeof(char*));
现在,我有一个 userId 数组
char *userId[numOfReducers];
userId[0] = "2234";
userId[1] = "2222";
userId[2] = "3223";
userId[3] = "2222";
对于每个 userId,我将调用一个函数 findRdrNum(userId[i])
,该函数将检查之前动态分配的字符数组 userToRdrMap
,如果 userId 存在,则应该返回索引,否则存储它然后返回索引。我无法继续解决这个问题,因为我对指针感到困惑和迷失。有人可以帮忙吗?这是我的程序,它尝试返回索引然后存储它。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int numOfReducers;
char** userToRdrMap = {NULL};
char* temp1;
int findRdrNum(char *userId){
if(!userToRdrMap[0]){
return 0;
} else{
int i;
printf("%s", userToRdrMap[1]);
for(i=0; i<numOfReducers; i++){
if(strcmp(userToRdrMap[i], userId))
return i;
}
}
return NULL;
}
int main (int argc, char *argv[])
{
numOfReducers = atoi(argv[1]);
int i;
char *userId[numOfReducers];
userId[0] = "2234";
userId[1] = "2222";
userId[2] = "3223";
userId[3] = "2222";
int rdrNum;
userToRdrMap = malloc(numOfReducers * sizeof(char*));
/* temp1 = malloc(numOfReducers * 4 * sizeof(char));
for (i = 0; i < numOfReducers; i++) {
userToRdrMap[i] = temp1 + (i * 4);
}
*/
printf("%s\n", userId[0]);
for(i=0; i<numOfReducers; i++){
rdrNum = findRdrNum(userId[i]);
strcpy(userToRdrMap[rdrNum], userId[i]);
printf("%d", rdrNum);
}
return 0;
}
谢谢,哈里什
最佳答案
问题:
你的问题有点令人困惑,但我可以明白你的意思,很明显你确实付出了一些努力来写一篇像样的帖子。因此,我尝试编写一个程序来完成您想要的任务,并且易于理解。
<小时/>程序:
以下程序会自动安装您在示例中提供的相同示例字符串。然后,它读取 main 的参数 vector (char *argc[]
) 中提供的每个参数,以检查它是否在其中。如果不是,则会安装它。正如您将在示例输出中看到的那样,所有内容都通过 print 语句进行了演示。
输出示例:
./a.out 2222 3223 kjd 090 kjd
The User ID "2222" exists at index 1!
The User ID "3223" exists at index 2!
Installed "kjd"!
Installed "090"!
The User ID "kjd" exists at index 4!
<小时/>
这是程序代码。我尝试发表评论,以便您了解我所做的事情。在底部,我将包含一些关于您的原始程序的评论以及您可以采取哪些措施来尝试改进它。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
// An array of strings: (A pointer to an array of pointers).
// Declaring a variable out in global scope is always initialized to NULL!
char **strings;
// 1: The index of the next free pointer. 2: The total number of pointers available.
int str_idx, str_size;
// Returns index of given string pointer `sp`. If it's not there, -1 is returned.
int indexOf (char *sp) {
for (int i = 0; i < str_idx; i++) {
// If string at index i == string we're looking for.
if (strcmp(sp, strings[i]) == 0) {
return i;
}
}
return -1;
}
// Copies given string into strings. If necessary, strings is resized.
void installString (char *sp) {
char *copy = NULL;
// 1. Ensure we have space. Otherwise resize strings array.
if (str_idx >= str_size) {
str_size = str_size * 2;
strings = realloc(strings, str_size * sizeof(char *));
}
// 2. Allocate space for copy of string. Print an error if it failed.
copy = malloc(strlen(sp) * sizeof(char));
if (copy == NULL) {
printf("Error: Allocation failure in \"installString\"!\n");
exit(EXIT_FAILURE);
}
// 3. Copy the contents over.
copy = strcpy(copy, sp);
// 4. Place the pointer (copy) at str_idx (next available spot), and post-increment str_idx.
strings[str_idx++] = copy;
}
int main (int argc, char *argv[]) {
// 1. Initialize our global strings array. Ensure it succeeded.
str_size = 10;
strings = malloc(str_size * sizeof(char *));
if (strings == NULL) {
printf("Error: Allocation failure in \"main\"!\n");
exit(EXIT_FAILURE);
}
// 2. Install some example User IDs.
installString("2234");
installString("2222");
installString("3223");
installString("2222");
// 3. Check the User IDs provided as program arguments.
// (I subtract from argc first because argument zero is the name of the program)
while (--argc) {
char *id = *(++argv); // Increment argv pointer (to skip program name), dereference at next argument.
// 4. If the id is installed, print the index. Otherwise install it.
int index;
index = indexOf(id);
if (index > -1) {
printf("The User ID \"%s\" exists at index %d!\n", id, index);
} else {
installString(id);
printf("Installed \"%s\"!\n", id);
}
}
// 5. Clean up allocated memory.
for (int i = 0; i < str_idx; i++) {
free(strings[i]);
}
free(strings);
return EXIT_SUCCESS;
}
<小时/>
提示:
语句:char** userToRdrMap = {NULL};
如果您将其保留在全局范围。原因是它会自动在那里初始化为 NULL。但如果它是本地变量或自动变量,则情况并非如此!
不要将零作为错误索引返回。零是一个有效的索引,-1 更有意义,因为索引 -1 处实际上没有任何东西。
您的函数 findRdrNum
表示它返回一个 int
。然而最后你返回NULL
,它通常用于指针。这是不一致的。不要这样做。
您没有释放在程序中分配的任何内存。你确实应该这样做。
您在程序中分配了一个字符串指针数组。但实际上您并没有为尝试复制到指针的字符串分配任何空间。这是未定义的行为并且 Not Acceptable 。如果要将任何内容复制到分配的指针数组中,则需要实际为要复制的字符串分配内存,然后将字符串数组中的指针值设置为分配的副本的值。我在我的例子中这样做。
关于c - 迭代动态分配的 char 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48601541/
这个问题在这里已经有了答案: Why don't Java's +=, -=, *=, /= compound assignment operators require casting? (11 个
当我尝试运行以下代码时,List(.of) 无法编译并给出主题错误。 package collections; import java.util.LinkedHashSet; import java.
我正在尝试编译使用 ChatScript 库的程序。这是我在名为 main.cpp 的文件中的代码: #include #include "common.h" using namespace std
我想在我的程序中外部使用 ChatScript。在documents它说: Embedding Step #1 First, you will need to modify `common.h and
假设我有一个 char,我想用一行代码将其 strcat() 转换为 char 数组。对于 [一个非实用的] 示例: strcat("ljsdflusdfg",getchar()); 或者我想做相反的
我有以下类型签名: *Main Lib> let f :: a -> a -> a -> a; f = undefined *Main Lib> let x :: Char; x = undefin
我正在学习如何在 C 中使用指针(使用 malloc 和 free),但我在这个练习中遇到了一些麻烦。我只想制作一个指针数组,我想在其中保存每个单词的方向。然后我想为一个特定的词做一个 free(),
我有一个字符*: char* version = "10.5.108"; 我想通过字符分隔符获取两个新的 char*。 char delimiter = '.'; 执行以下代码后: printf("|
最近在学习Cpp,今天在学习使用Clion做测试的时候,发生了奇怪的事情。 这是我的代码 int main() { char c = 'b'; char carr[1]{'a'};
我对 c 很陌生,我正在审查一些代码。我遇到了这个: static char * fromDataType; static char * toDataType; static char * fromR
我有一个像这样的动态结构: struct network { int count; char** ips; } 如果我知道每个字符串数组都是 16 个字节(即 INET_ADDRSTR
我有一个旧程序,其中使用了一些库函数,但我没有那个库。 所以我正在使用 C++ 库编写该程序。在那个旧代码中有一些函数是这样调用的 *string = newstrdup("这里有一些字符串"); 字
我正在编写一个函数,该函数接受 ArrayList,然后将每个 char[] 复制到另一个增加长度的 char[] 中,然后将新的 char[] 添加到新的 ArrayList 中。当我尝试复制数组时
我正在寻找 map >并生成每个可能的 map从它。 我知道这可能会占用大量内存并需要一些时间。 每个map需要包含每个字母 a-z,并映射到唯一的 a-z 字符。 IE。啊bjcp迪EVfh嘎血红蛋
#define NAME_LEN 20 #include "stdio.h" #include "stdlib.h" #include "string.h" #pragma warning(disab
所以我必须创建一个函数来找到一对带有第一个字母并返回第二个字母的函数。 我实际上找到了一个答案,但是使用 map 功能却找不到。 lookUp :: Char -> [(Char, Cha
我最近接受采访并要求写mystrcat(*s1, *s2, *s3) 其中s1 和s2 是源字符串连接结果由 s3 给出。有人告诉我,不要担心 s3 的内存分配,并假设 s1 和 s2 不是空/无效字
今天我与一位同事讨论了他(对我来说)不寻常的“main”函数签名。他喜欢这样声明: int main(int argc, char* (*argv)[]) { printf("at index
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicate: What's the difference between new char[10] and new cha
通常字符串文字是 const char[] 类型。但是当我把它当作其他类型时,我得到了奇怪的结果。 unsigned char *a = "\355\1\23"; 使用此编译器会抛出警告“初始化中的指
我是一名优秀的程序员,十分优秀!