【问题标题】:Input 50 characters into a string in C在C语言中输入50个字符到一个字符串中
【发布时间】:2021-07-10 00:44:10
【问题描述】:
#include<stdio.h>

#include<ctype.h>

#include<string.h>

#define _CRT_SECURE_NO_WARNINGS

int main(void){

//declare 3 char arrays to hold 3 strings of 20 characters each.
char string1[51];
char string2[51];
char string3[51];


// Prompt the user to enter string 1.
printf("Input String 1 : ");

/* Use the gets() function to input the string user enters into string1*/
fgets(string1, sizeof(string1), stdin);

// Prompt the user to enter string 2.
printf("Input String 2 : ");

/* Use the gets() function to input the string user enters into string2*/
fgets(string2, sizeof(string2), stdin);

//Perform the strcpy() operation on string3 from string 1.
//char *strcpy(char *string3, const char *string1);
//strcpy_s(string3, string1, sizeof(string3) - 1);
 memcpy(string3, string1, 51); 


//print string 3
 printf("String3: ");
 printf("%s",string3);

//Use the strlen() function on string 2
 int len;
 len = strlen(string2);

//print the output.
 printf("String 2 length: ");
 printf("%d \n",len);

//Use the strcmp function to compare string and string 2.
 int results;
 strcmp(string1, string2);
 results = strcmp(string1, string2);

 //print the result

if (results < 0) {
    printf("str1 is less than str2\n");
}
else if (results > 0) {
    printf("str2 is less than str1\n");
}
else {
    printf("str1 is equal to str2\n");
}


//Convert characters in string 1 to uppercase using the toupper()  

 
 int i = 0;
 int j = 0;

char chr;
for (i = 0; string1[i]; i++)
{
    chr = string1[i];
    printf("%c", toupper(chr));
}




/*Convert all the characters in string 2 to uppercase using the tolower()  
function on every character using a for loop.*/

 for (j = 0; string2[i]; j++)
 {
    chr = string2[i];
    printf("%c", tolower(chr));
}

return 0;
}

我正在尝试将 string1 复制到 string3,但是当我使用 strcpy()strcpy_s() 时会引发错误。如果我从程序中完全删除strcpy(),它将运行。

我为每个字符串输入了 50 个字符,那么它们是否需要为 51 因为 null?

我已经更新了我的代码。输入大写字母时,我无法让 tolower() 以小写形式显示 string2。

请告知我有关更改以及需要进行更改的原因。

错误:错误 C4996 'strcpy':此函数或变量可能不安全。
考虑改用 strcpy_s。要禁用弃用,请使用 _CRT_SECURE_NO_WARNINGS

【问题讨论】:

  • 它会抛出一个错误。请显示确切的错误。事实上,请显示整个运行日志,包括准确的输入、输出和产生的错误。
  • 错误 C4996 'strcpy':此函数或变量可能不安全。考虑改用 strcpy_s。要禁用弃用,请使用 _CRT_SECURE_NO_WARNINGS。
  • Edit 使用该信息更新帖子。
  • 错误消息非常清楚地告诉您它希望您做什么:考虑改用 strcpy_s使用 _CRT_SECURE_NO_WARNINGS。它会告诉你原因:函数或变量可能不安全。哪一部分你不明白?
  • for (i = 0; i &lt;= string1[i]; i++) 很奇怪。也许for (i = 0; string1[i]; i++)

标签: arrays c string strcpy


【解决方案1】:

该错误是由于 Visual Studio 不喜欢 strcpy 并建议使用 strcpy_s,这可以防止缓冲区溢出。

strcpy_s(string3, sizeof(string3), string1);

请记住,strcpy_s 仅在少数平台上可用。 strncpy 是一个更便携的函数,它做类似的事情,但是你需要传递它 sizeof(string3) - 1 而不是 sizeof(string3) 并且如果 string3 的所有 50 个字节都被写入,它不会以空值终止结果,所以你必须自己做。

strncpy(string3, string1, sizeof(string3) - 1);
string3[sizeof(string3) - 1] = '\0';

或者,您可以#define _CRT_SECURE_NO_WARNINGS 并继续使用strcpy

【讨论】:

  • 谢谢! -1 的原因是什么?
  • strncpy 取字符串的长度,不包括空终止符。
  • @chux-ReinstateMonica 我改了答案。
猜你喜欢
  • 1970-01-01
  • 2016-02-04
  • 1970-01-01
  • 2021-07-20
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
  • 2021-10-24
相关资源
最近更新 更多