【问题标题】:strcmp in c ( invalid conversion)c中的strcmp(无效转换)
【发布时间】:2021-06-12 01:11:37
【问题描述】:

这是来自codeforces https://codeforces.com/problemset/problem/339/A的问题

这是我卡住的代码。

char full_string[100];
char string[100][1];
for (int i = 0; i < strlen(full_string); i++)
{
    for (int j = 0; j < 2; j++)
    {
        if (j = 0)
        {
            if (strcmp(string[i][j], string[i + 1][j]) < 0)
            {
                char temp;
                temp = string[i][j];
                string[i][j] = string[i + 1][j];
                string[i + 1][j] = temp;
            }
        }
        printf("%c", string[i][j]);
    }
}

编译器告诉我这个。

" 从 'char' 到 'const char*' 的无效转换"

主要问题在于 strcmp。它说它需要 const char* 但字符串参数是 char。 我是否应该创建一个新的 int 数组来存储数字。然后我将使用 atoi 将字符串转换为整数。所以我可以使用 "if(expression)" 而不是 strcmp。

【问题讨论】:

  • 您正在传递一个char 变量,但strcmp() 的参数必须是(char*, char*)
  • 您在哪里写char string[100][1];,您希望string 在内存中看起来像什么 - 您对尺寸有何期望?然后当您执行string[i][j] 时,您是希望从中得到一个指针,还是一个字符?如果是指针,为什么?如果是单个字符,您为什么希望它像这样与 strcmp 一起使用?
  • 发布的代码不过是一个代码片段。它缺少所需的#include 语句。它缺少一个“main()”函数(事实上它根本没有函数定义)请发布minimal reproducible example,以便我们可以简单地复制您的代码,重现问题
  • 关于这种语句:for (int i = 0; i &lt; strlen(full_string); i++)strlen() 返回的类型是size_t(一个无符号长整型),并且该语句试图将该无符号值与int 进行比较是有符号值
  • 关于:for (int j = 0; j &lt; 2; j++) { if (j = 0) 因为j 总是被赋值为0,结果是一个无限循环

标签: arrays c string


【解决方案1】:

这里是strcmp函数的原型:

int strcmp(const char *s1, const char *s2);

它比较两个字符串,如果比较的字符串相等,则返回 0。如果 string1 大于或小于 string2,则为非零值。

如果你想比较两个字符,你必须像比较int一样使用普通比较。

例如:

char a = 'a';
char b = 'b';
if (a == b) {
   printf("%c is equal to %c\n", a, b);
} else {
   printf("%c is not equal to %c\n", a, b);
} 

在这种情况下显然是 a != b

【讨论】:

    【解决方案2】:

    我认为您不需要strcmp,因为您只是想将两个字符作为上面提到的 limserhane 的答案进行比较。

    if (strcmp(string[i][j], string[i + 1][j]))
    

    应该看起来像

    if (string[i][j] < string[i + 1][j])
    

    另外,我无法理解您要做什么,如下代码

    char temp;
    temp = string[i][j];
    string[i][j] = string[i + 1][j];
    string[i + 1][j] = temp;
    

    将切换数字和“+”运算符的位置。

    由于问题是考虑学生正在处理一位数,我会编写一个辅助函数,将所有一位数作为字符数组/字符串,然后排序,然后将所有排序返回。 然后在需要的地方添加“+”运算符。

    【讨论】:

    • 此外,for (int j = 0; j &lt; 2; j++) 的用途尚不清楚,即使将if (j = 0) 固定为if (j == 0)
    【解决方案3】:

    以下建议的代码:

    1. 干净编译
    2. 对传入的 char 数组执行冒泡排序

    现在,建议的代码:

    #include <stdio.h> 
      
    void swap( char *xp, char *yp) 
    { 
        char temp = *xp; 
        *xp = *yp; 
        *yp = temp; 
    } 
      
    // A function to implement bubble sort 
    void bubbleSort(char arr[], size_t numelements) 
    { 
    
        for ( size_t i = 0; i < numelements-1; i++)       
        {
           // Last i elements are already in place    
           for ( size_t j = 0; j < numelements-i-1; j++)  
           {
                if (arr[j] > arr[j+1]) 
                {
                    swap(&arr[j], &arr[j+1]); 
                }
            }
        }
    } 
    

    我把它留给 OP 来提取数据数字(即删除所有 + 符号。

    我把结果留给 OP 打印出来

    【讨论】:

      【解决方案4】:

      代码有多个问题:

      • 您将单个 char 值传递给 strcmp 而不是指向 char 的指针:这是不正确的,将导致未定义的行为。只需使用if (full_string[i - 2] &gt; full_string[i]) { /* swap characters */ }
      • 不需要二维数组char string[100][1];,只需对full_string进行排序即可。
      • 在外循环开始时只计算一次full_string 的长度。
      • 冒泡排序应该足够快,因此可以在 2 秒内对 50 个条目进行排序。

      这是修改后的版本:

      #include <stdio.h>
      
      char *sort_summands(char *str) {
          int len = strlen(str);
          int sorted = 0;
          while (!sorted) {
              sorted = 1;
              for (int i = 2; i < len; i++) {
                  if (str[i - 2] > str[i]) {
                      char c = str[i - 2];
                      str[i - 2] = str[i];
                      str[i] = c;
                      sorted = 0;
                  }
              }
          }
          return buf;
      }
      
      int main() {
          char buf[128];
          if (fgets(buf, sizeof buf, stdin)) {
              fputs(sort_summands(buf), stdout);
          }
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多