c-对字符串数组使用strcpy()或strncpy()



我很难将给定索引的数组中的字符串复制到另一个字符串数组中,有什么建议吗?当试图在任何给定的索引上打印出tempVal的值时,它不会返回任何内容。

#include <stdio.h>
#include <string.h>
int main(void) {
const int NUM_VALS = 20;
int i;
int matchCount = 0;
int actualInput;
scanf("%d", &actualInput);
char userString[actualInput][NUM_VALS];
char tempVal[actualInput][NUM_VALS];
for (i = 0; i < actualInput; ++i) {
scanf("%s", userString[i]);
// printf("%s", userString[i]);
strncpy(userString[i], tempVal[i], strlen(userString[i])); // < -- Not sure how to make work
printf("%s", tempVal[i]); // <-- Doesn't output anything?
}
return 0;
}

使用函数来限制读取的字符数,并将终止符设置为零以及

for (int i = 0; i < actualInput; ++i) {
fgets(userString[i], NUM_VALS, stdin);
strcpy(tempVal[i], userString[i]); // < -- Not sure how to make work
printf("%sn", tempVal[i]); // <-- Doesn't output anything?
}

难怪您没有得到合适的输出,因为使用所提供的代码,您可能会遇到Segmentation错误。除此之外,代码中还有几个问题。解释所有内容并回答标题问题会让整个框架爆炸。您可以在下面看到我是如何以自己的方式更正代码的。

char*strcpy(char*目的地,const char*源(

如果destinationchar缓冲区不够大,无法容纳要由source复制的字符串,则strcpy可能会导致缓冲区溢出。在您的情况下,这是可以的,因为每个缓冲区userString[i]tempVal[i]具有相同的容量(char元素的数量(,但如果代码发生更改,可能会造成危害。

请注意,当您从stdin获取字符串时,还应该限制输入字符的数量。由于这个原因,fgets()scanf()更安全,因为它明确要求读取最大数量的字符。

char*strncpy(char*目的地,const char*源,size_t num(;

如果源字符串的第一个num字符不包含终止的,则strncpy无法附加终止的空字符。

而是使用对1安全的snprintf()。证明目的地缓冲区的大小,并限制要读取的字符数量和2。总是附加一个空字符(假设扫描过程成功并且没有发生错误(:

#include <stdio.h>
#include <string.h>
int main(void) {
const int NUM_VALS = 20;
int i;
int s_num;
printf("Enter number of strings in array: ");
scanf("%d", &s_num);
getchar();
char userString[s_num][NUM_VALS];
char tempVal[s_num][NUM_VALS];
for (i = 0; i < s_num; ++i) {
printf("Enter string at userString[%d]: ",i);
if(fgets(userString[i],NUM_VALS, stdin) == NULL)
{
// error handling
if(ferror(stdin))
{
// handle I/O error.
}
else if(feof(stdin))
{
// end of file is reached.
}
}
else
userString[i][strcspn(userString[i], "n")] = 0;
//printf("%s", userString[i]);
}
printf("n");
for (i = 0; i < s_num; ++i) {
if(snprintf(tempVal[i], sizeof(tempVal[i]), "%s", userString[i]) < 0)
{
// error handling
fprintf(stderr,"Encoding error occurred!");
}
printf("tempValue[%d]: %sn", i, tempVal[i]);
}
return 0;
}

测试运行时的输出:

Enter number of strings in array: 3               
Enter string at userString[0]: hello    
Enter string at userString[1]: world 
Enter string at userString[2]: test
tempValue[0]: hello
tempValue[1]: world
tempValue[2]: test
抱歉各位

我正在上一门课,刚到C。我已经想好了如何解决我的问题。我很感激关于修复代码的建议,不幸的是,它们超出了我在入门课程中学到的范围。我必须使用字符串数组和for循环来查找单词频率。以下是完整的工作代码:

#include <stdio.h>
#include <string.h>
int main(void) {
const int NUM_VALS = 20;
int i;
int j;
int matchCount = 0;
int actualInput;
scanf("%d", &actualInput);
char userString[actualInput][NUM_VALS];
char tempVal[actualInput][NUM_VALS];
for (i = 0; i < actualInput; ++i) {
scanf("%s", userString[i]);
strcpy(tempVal[i], userString[i]);
// printf("%sn", userString[i]);
// printf("%sn", tempVal[i]);
}
for (i = 0; i < actualInput; ++i) {
matchCount = 0;
for (j = 0; j < actualInput; ++j) {
if (strcmp(userString[i], tempVal[j]) == 0) {
matchCount++;
}
}
printf("%s %dn", userString[i], matchCount);
}

return 0;
}

相关内容

  • 没有找到相关文章

最新更新